我使用文本编辑器将某个源代码复制并粘贴到我的程序中。我基本上需要确认源代码以“int main()”开头,所以我继续将行与“int main()”进行比较,但比较总是返回false。
我决定将字符串剥离成字符并发现一些奇怪的东西。
所以字符串行在其中传递“int main()”,这是在文本编辑器中粘贴的文本。你会认为a和b会有相同的字符,但它们不会:
老实说,我不确定开头的引号来自哪里。原始字符串不包含它,调试器不显示它(否则将显示“\”int main()\“”)。这里发生了什么?
编辑:我尝试过line = line.Trim()。这个角色还没有消失。显然它是零宽度不间断空间的一些特殊的unicode字符。如何从字符串中删除它?
答案 0 :(得分:2)
65279看起来像是UTF-16 BOM(U + FEFF)的十进制表示,您将数据读入“line”的方式是否有可能无法将其删除?
答案 1 :(得分:1)
您可以将line
设置为line.Trim();
如果没有看到line
的设置方式,很难说出可能会发生什么。
基于BOM字符更新:尝试line.Trim(new char[]{'\uFEFF'});
假设.NET 4
答案 2 :(得分: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);
那是古怪的......
答案 3 :(得分:-1)
在您发布的代码中,似乎line
变量以空格字符开头。试试line = line.Trim();
修改强>
string.Trim()
(U+FEFF)
方法未按预期工作的原因
从.NET Framework 4开始,该方法修剪所有Unicode空格字符(即,在传递给Char.IsWhiteSpace方法时产生真实返回值的字符)。由于此更改,.NET Framework 3.5 SP1和更早版本中的Trim方法删除了两个字符,ZERO WIDTH SPACE(U + 200B)和ZERO WIDTH NO-BREAK SPACE(U + FEFF),即Trim方法。 NET Framework 4及更高版本不会删除。
line
似乎是Trim
开头的角色,因此{{1}}没有处理它。