2012-08-17 102 views
0

返回一個多字節如果我編碼以下字符串爲UTF8:編碼歐洲字符

咖啡廳

它返回5個字節,而不是4,我想它如果可能的話,返回4個字節。

Encoding encoding = Encoding.UTF8; 
string testString = "café"; 
Byte[] bytes = encoding.GetBytes(testString); 

返回:

[0] 99 
[1] 97 
[2] 102 
[3] 195 
[4] 169 

而 「網吧」 只返回4個字節。

+1

?你的期望是什麼?你期望UTF8將「é」轉換爲「e」嗎? – 2012-08-17 00:15:49

回答

0

端上變換UTF8ISO8859-1和它現在返回4個字節,而不是5

Encoding utf8 = Encoding.UTF8; 
string testString = "café"; 
byte[] utfBytes = utf8.GetBytes(testString); // 5 bytes 

Encoding iso = Encoding.GetEncoding("ISO-8859-1"); 
byte[] isoBytes = iso.GetBytes(testString); // 4 bytes 
byte[] convertedUtf8Bytes = Encoding.Convert(utf8, iso, utfBytes); // 4 bytes 

string msg = iso.GetString(isoBytes); 
string msgConverted = iso.GetString(convertedUtf8Bytes); 

Console.WriteLine(msg); 
Console.WriteLine(msgConverted); 

輸出:

咖啡廳

咖啡館

3

你不能用正常的編碼方案。

您需要創建一個自定義編碼與所需的代碼頁,像這樣:

Encoding encoding = Encoding.GetEncoding(437); 
byte[] bytes = encoding.GetBytes("café"); 

輸出:

{ 99, 97, 102, 130 } 

E爲code page 437 130。

假設你將要解碼它,你需要用相同的編碼來解碼它。否則,你會得到奇怪的結果。

3

é是Unicode U + 00E9。 Unicode字符U + 0080到U + 07FF在UTF8中佔用兩個字節。有關更多詳細信息,請參見http://en.wikipedia.org/wiki/Utf8

如果你只想要4個字節,那麼你就不能使用UTF8。理論上你可以使用ISO 8859-1這是一個單字節字符編碼。