【问题标题】:Simplest way to get rid of zero-width-space in c# string在 C# 字符串中摆脱零宽度空间的最简单方法
【发布时间】:2014-09-16 12:11:00
【问题描述】:

我在 c# VSTO 项目中使用正则表达式解析电子邮件。偶尔,正则表达式似乎不起作用(尽管如果我将文本和正则表达式粘贴到 regexbuddy 中,正则表达式会正确匹配文本)。如果我查看 gmail 中的电子邮件,我会看到

=E2=80=8B

在某些行的开头和结尾(我理解的是UTF8零宽度空间);这似乎是弄乱正则表达式的原因。这似乎只是出现的序列。

摆脱这个确切顺序的最简单方法是什么?我做不到明显的

MailItem.Body.Replace("=E2=80=8B", "")

因为这些字符不会出现在 c# 字符串中。

我也试过

byte[] bytes = Encoding.Default.GetBytes(MailItem.TextBody);
string myString = Encoding.UTF8.GetString(bytes);

但是零宽度的空格只是显示为?。我想我可以遍历字节数组并删除包含零宽度空间的字节,但我不知道字节会是什么样子(它似乎不像将 E2 80 8B 转换为十进制并搜索那样简单) .

【问题讨论】:

    标签: c# regex utf-8 character-encoding


    【解决方案1】:

    由于所有Regex.Replace() 方法都对字符串进行操作,因此这里没有用处。

    字符串索引器返回一个字符,因此如果需要更好的解决方案(如果您无法预测这些字符将在哪里),尽管看起来很冗长,但最好使用以下方法:

            StringBuilder newText = new StringBuilder();
    
            for (int i = 0; i < MailItem.Body.Length; i++)
            {
                if (a[i] != '\u200b')
                {
                    newText.Append(a[i]);
                }
            } 
    

    【讨论】:

    • 这个答案也有效,但是 Robert S.'更简洁,所以我接受了。
    【解决方案2】:

    由于 C# 中的字符串以 Unicode(而不是 UTF-8)存储,因此以下可能会解决问题:

    MailItem.Body.Replace("\u200B", "");
    

    【讨论】:

      【解决方案3】:

      使用 System.Web.HttpUtility.HtmlDecode(string); 很简单。

      【讨论】:

      • 根据我的经验,这不会删除所有不可见的空白字符,因为我仍然留下一个长度为 1 的字符串,它看起来是空的,并且没有跳闸string.IsNullOrWhitespace
      猜你喜欢
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2011-01-31
      相关资源
      最近更新 更多