在 C# 字符串中摆脱零宽度空间的最简单方法
Posted
技术标签:
【中文标题】在 C# 字符串中摆脱零宽度空间的最简单方法【英文标题】:Simplest way to get rid of zero-width-space in c# string 【发布时间】: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 转换为十进制并搜索那样简单) .
【问题讨论】:
【参考方案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
以上是关于在 C# 字符串中摆脱零宽度空间的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章