1

我使用文本编辑器将某个源代码复制并粘贴到我的程序中。我基本上需要确认源代码以“int main()”开头,所以我继续将行与“int main()”进行比较,但比较总是返回 false。

我决定将字符串剥离成字符并发现一些奇怪的东西。

在此处输入图像描述

所以字符串行在其中传递了“int main()”,这是已粘贴在文本编辑器中的文本。您会认为 a 和 b 具有相同的字符,但它们没有:

在此处输入图像描述

老实说,我不确定开头的引号是从哪里来的。原始字符串不包含它,调试器不显示它(否则它将显示 "\"int main()\"")。这里发生了什么?

编辑:我试过 line = line.Trim()。那个角色还没有消失。显然,它是零宽度不间断空间的一些特殊 unicode 字符。如何从我的字符串中删除它?

4

4 回答 4

2

65279 看起来像 UTF-16 BOM (U+FEFF) 的十进制表示,您将数据读入“行”的方式是否可能无法删除它?

于 2012-10-15T04:20:08.520 回答
1

你能设置line成吗line.Trim(); ?如果不看看设置如何,很难说出可能发生的事情line

基于 BOM 字符的更新:尝试line.Trim(new char[]{'\uFEFF'});假设 .NET 4

于 2012-10-15T04:19:13.030 回答
0

我找到了解决方案:

private readonly string BYTE_ORDER_MARK_UTF8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());

...

if (line.StartsWith(BYTE_ORDER_MARK_UTF8))
                line = line.Remove(0, BYTE_ORDER_MARK_UTF8.Length);

那很奇怪...

于 2012-10-15T04:36:17.637 回答
-1

在您发布的代码中,变量似乎line以空格字符开头。尝试line = line.Trim();

编辑:

string.Trim()方法无法按预期工作的原因可以在MSDN上找到

从 .NET Framework 4 开始,该方法会修剪所有 Unicode 空白字符(即,在将它们传递给 Char.IsWhiteSpace 方法时产生真正返回值的字符)。由于此更改,.NET Framework 3.5 SP1 及更早版本中的 Trim 方法删除了 .NET Framework 3.5 SP1 和更早版本中的 Trim 方法中的两个字符,零宽度空格 (U+200B) 和零宽度无间断空格 (U+FEFF)。 NET Framework 4 及更高版本不会删除。

(U+FEFF)似乎是开头的字符line,因此为什么Trim不处理它。

于 2012-10-15T04:15:10.517 回答