您现在的位置是:网站首页>编程语言
C#去除字符串中的幽灵字符
【编程语言】阿文2020年4月05日455浏览
简介最近做一个网站采集练手demo时遇到一个比较棘手的问题,自己做采集程序也不多,遇到这个问题时一时也懵了,页面拿去到的数据看着有点像base64编码的数据,也有点像加密的数据,说是像base64编码的数据我自己也试……
最近做一个网站采集练手demo时遇到一个比较棘手的问题,自己做采集程序也不多,遇到这个问题时一时也懵了,页面拿去到的数据看着有点像base64编码的数据,也有点像加密的数据,说是像base64编码的数据我自己也试着base64还原也没还原出来,加密数据呢大概看完页面的编码展示和js也没看到解密之类的处理,最后谷歌一番找到一种可能" ISO-8859-1字符",完整的内容我就补不贴出来,我贴出一小段示例:
var unstr = "玩SM";
上面这个字符串就是采集的网页上一小段内容,找了网上将 ISO-8859-1字符格式字串转换为原始字符串的方法试了下还不错,具体方法如下:
private string ISO_8859_1ToString(string srcText)
{
string dst = "";
string[] src = srcText.Split(';');
for (int i = 0; i < src.Length; i++)
{
if (src[i].Length > 0)
{
string str = ((char)int.Parse(src[i].Substring(2))).ToString();
dst += str;
}
}
return dst;
}
实际运行过程中还是发现有部分数据没法还原,断点调试时发现有开白的字符串,而且空白字符串也不是空格,于是自己又找了一段去除特殊字符串的代码组合使用:
/// <summary>
/// 格式化一段字符串, 将字符串中的 非预期的 幽灵字符 删除.
/// </summary>
/// <param name="str"></param>
/// <param name="preserveRare">如下字符是否保留(true: 保留, false 剔除, 默认 false剔除): \a 响铃(BEL) \b 退格(BS) \f 换页(FF) \v 垂直制表(VT) \0 空字符(一般C++标识字符串结束) </param>
/// <returns></returns>
public static string FormatString(string str, bool preserveRare)
{
if (string.IsNullOrEmpty(str)) return string.Empty;
StringBuilder sb = new StringBuilder();
foreach (char c in str)
{
if (c == ' ' || c == '\r' || c == '\n' || c == '\t') { sb.Append(c); continue; }
if (c == '\a' || c == '\b' || c == '\f' || c == '\v' || c == '\0') { if (preserveRare) { sb.Append(c); } continue; } //这段代码感觉有性能问题,但细品之下却发现:毫无破绽
if (!char.IsWhiteSpace(c)) { sb.Append(c); continue; }
//剩下的 幽灵字符 特殊处理:
//经过测试: 0x0 - 0xFFFFFF 的 char 字符中, 幽灵字符 要么是 控制符, 要么是分割符.
//如果是 分隔符, 我们将其替换成空格
//如果是 控制符, 我们将其直接剔除,
if (char.IsSeparator(c)) { sb.Append(' '); continue; }
//if (char.IsControl(c)) continue; //无意义代码,不需要执行:剩下的字符 通通过滤掉
}
return sb.ToString();
}
private static string ISO_8859_1ToString(string srcText)
{
string dst = "";
string[] src = srcText.Split(';');
var lstr = "";
for (int i = 0; i < src.Length; i++)
{
lstr = FormatString(src[i], false);
if (lstr.Length > 0 && lstr.IndexOf("&#") > -1)
{
lstr = lstr.Remove(0, lstr.LastIndexOf("&#"));
string str = ((char)int.Parse(lstr.Substring(2))).ToString();
dst += str;
}
else
{
dst += lstr;
}
}
return dst;
}
以上就是我拼接组合出来的方法,具体调用方法如下:
var unstr = "玩SM";
var sResult = ISO_8859_1ToString(unstr.Trim());
去除字符串中的幽灵字符,在实际编码过程中时不时会遇到,比如execl内容导入、word内容解析也会存在换行符、分页符等等一些特殊的符号。
此处留作笔记。
评论文明上网,理性发言0条评论