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

时间:2015-03-30 19:33:30

标签: c# unicode character-encoding c#-3.0 byte-order-mark

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

字节数组如下:

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

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

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

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

目前我正在使用的解决方法是var.Trim(new char[]{'\uFEFF','\u200B'});,它的工作正常。

但问题确实是,GetString不应该删除字节顺序标记吗?或者我在转换字节数组时做错了什么?

1 个答案:

答案 0 :(得分:1)

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

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

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