2015-03-30 76 views
2

在我的.NET 3.5 C#應用程序中,我將一個unicode編碼的字節數組轉換爲字符串。Unicode轉換爲字符串葉字節Byte命令標記

的字節數組如下:

{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小心刪除字節順序標記?或者我在轉換字節數組時做錯了什麼?

+0

@bzlm:_「Encoding.Unicode可能會返回一個UTF-16編碼器」_ - 沒有「可能」關於它。它有_better_這樣做,因爲這是它被記錄下來的:[「使用little endian字節順序的UTF-16格式的編碼。」](https://msdn.microsoft.com/zh-cn/library/ system.text.encoding.unicode(v = vs.110).aspx) – 2015-03-30 19:43:15

+1

你爲什麼要修剪'\ u200B'? – xanatos 2015-03-30 19:51:00

回答

1

不,GetString()不應該刪除BOM。 BOM實際上是一個完全有效的Unicode字符(具體選擇是因爲它出現在Unicode文件的中間,例如,如果該文件是連接多個Unicode文件的結果,則不會影響呈現的文本),並且必須解碼以及byte[]中的所有其他字符。

應該解釋和過濾BOM的唯一代碼是理解數據來自某些持久性存儲的代碼,例如, StreamReader。並且請注意,只有當您不禁用該行爲時纔會這樣做。

所有這些GetString()應該做的是解釋實際的編碼的字符,並把它們轉換成他們所代表(當然,在C#中的字符串在內部存儲爲UTF-16,所以當原始數據已經是有很少到轉換文本UTF16 :))。

+0

但是BOM從哪裏來?看看字節數組,我沒有看到它的二進制表示。 – 2015-03-30 19:46:17

+1

@CristianoSousa 255 254是「BOM」,即空間。還是你的意思是別的? – bzlm 2015-03-30 19:48:17

+0

@CristianoSousa:正如評論者bzlm所說,它在你的原始數據中。 '255' =='0xff'和'254' =='0xfe'。因此,這個小端UTF16編碼的前兩個字節解析爲「0xfeff」或「65279」十進制。就像你在解碼文本中看到的一樣。 – 2015-03-30 19:51:25