2013-09-26 64 views
1

爲什麼這條線System.Text.Encoding.UTF8.GetBytes額外的字節

System.Text.Encoding.UTF8.GetBytes("ABCD±ABCD") 

給我帶回10個字節,而不是9? 雖然±是字符(177)

是否有.Net函數/編碼將這個字符串正確轉換成9個字節?

+2

「正確」很大程度上取決於「正確」編碼是什麼。如果你的意圖是使用UTF-8,那麼:沒有辦法將它正確地編碼爲9個字節。如果您的意圖是使用***一些***編碼將其編碼爲9個字節,則需要先決定要使用哪種基於代碼頁的編碼,以及爲什麼以及您要做什麼用於那些未在該代碼頁中定義的數據。 –

+0

「正確」的定義:能夠將其從字節翻譯回原始字符。例如:ASCII編碼不會正確地做到這一點,雖然它將被限制在我預期的9個字符。 –

回答

5

您應該使用Windows-1251編碼得到±177

var bytes = System.Text.Encoding.GetEncoding("Windows-1251").GetBytes("ABCD±ABCD"); 
+1

+1,但你應該解釋爲什麼它可能會像Windows-1251而不是UTF-8一樣工作。 –

+0

,然後在有人試圖編碼0xFF以外的東西時觀看煙花...... –

+0

這是我正在尋找的答案。我完全理解0xFF以外的任何內容都不能編碼成單個字節。如果你已經解釋了UTF8的工作原理,那將是一個完美的答案。以下@ user2316005發佈的視頻鏈接非常好地解釋了它。 –

6

雖然±是char(177)

而UTF-8編碼是爲0xC2 0xb1 - 兩個字節。基本上,每個> = 128的代碼點將佔用多個字節 - 字節數取決於代碼點的大小。

當用UTF-8編碼時,該數據是10字節。這裏的錯誤是你的期望,它應該採取9.

+0

「正確」的定義:能夠將它從字節翻譯回原始字符。例如:ASCII編碼不會正確地做到這一點,雖然它將被限制在我預期的9個字符。 –

+0

我想我預計UTF8只需要使用每個字符8位(顧名思義 - 至少對我來說),就是這樣。 –

1

±落在ASCII範圍的一邊,所以它由2個字節表示。