Unicode 转换为 String 留下前导字节顺序标记

Unicode conversion to String leaves leading Byte order mark

在我的 .NET 3.5 C# 应用程序中,我将 unicode 编码的字节数组转换为字符串。

字节数组如下:

{255, 254, 85, 0, 83, 0, 69, 0}

使用 Encoding.Unicode.GetString(var),我将字节数组转换为字符串,returns:

{65279 '', 85 'U', 83 'S' , 69 'E'}

前导字符 65279 似乎是 Zero Width No-Break Space,它在 Unicode 编码中用作字节顺序标记,它的出现导致我的应用程序的其余部分出现问题。

目前我使用的解决方法是 var.Trim(new char[]{'\uFEFF','\u200B'});,效果很好。

但真正的问题是,GetString不应该注意删除字节顺序标记吗?还是我在转换字节数组时做错了什么?

不,GetString() 不应删除 BOM。 BOM 实际上是一个完全有效的 Unicode 字符(之所以选择它是因为如果它出现在 Unicode 文件的中间,例如,如果文件是连接多个 Unicode 文件的结果,它不会影响呈现的文本)并且必须被解码以及 byte[].

中的所有其他字符

唯一应该解释和过滤 BOM 的代码是理解数据来自某些持久存储的代码,例如StreamReader。请注意,只有当您不禁用该行为时,它才会这样做。

GetString() 应该做的就是解释实际编码的字符并将它们转换为它们所代表的文本(当然,在 C# 中,字符串在内部存储为 UTF16,因此当原始数据已经是 UTF16 :)).