您现在的位置是:网站首页>编程语言

C#去除字符串中的幽灵字符

编程语言阿文2020年4月05日2905浏览

简介最近做一个网站采集练手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 = "&#29609;SM";
            var sResult = ISO_8859_1ToString(unstr.Trim());

去除字符串中的幽灵字符,在实际编码过程中时不时会遇到,比如execl内容导入、word内容解析也会存在换行符、分页符等等一些特殊的符号。

此处留作笔记。


标签: .net C#

0

评论文明上网,理性发言0条评论