在C#字符串中去除零宽空格的最简单方法

14

我正在使用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 转换为十进制并搜索那样简单)。

3个回答

27

由于 C# 中的字符串是以 Unicode(而不是 UTF-8)存储的,因此以下代码可能会有所帮助:

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

为了消除所有类似的Unicode字符(请参见https://www.utf8-chartable.de/unicode-utf8-table.pl?start=8192&number=128),并将它们替换为空格字符:Regex.Replace(textWithUnicodeCharacters, @"\s", " ") - xhafan

3

由于所有的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.的更简洁,所以我接受了他的回答。 - Jimmy

0

使用 System.Web.HttpUtility.HtmlDecode(string) 方法,非常简单。


1
根据我的经验,这并不能移除所有的不可见空格字符,因为我仍然得到了一个长度为1的字符串,看起来是空的,但却无法触发 string.IsNullOrWhitespace - phantomraa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接