2013-04-12 208 views
2

此C#代碼...ASCIIEncoding.ASCII.GetBytes()返回意外值

string s = "\u00C0"; 
byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s); 
Trace.WriteLine(BitConverter.ToString(bytes)); 

產生以下輸出:

3F 

爲什麼輸出不C0?

+2

您可能正在尋找'Encoding.GetEncoding( 「ISO-8859-1」) .GetBytes(多個)'。這是[只給出正好代碼點值的字節值的編碼](http://stackoverflow.com/a/15938015/995876)。 – Esailija

+0

我想知道,爲什麼你需要ASCIIEncoding? UTF8Encoding有什麼問題? –

回答

4

因爲\u00c0不是ASCII碼(0-127範圍)。結果它被編碼,就好像它是問號 - ?(0x3F)。

ASCIIEncoding

參見MSDN文章:

ASCIIEncoding對應於20127. Windows的代碼頁由於ASCII是一個7位編碼,ASCII字符被限制到最低128 Unicode字符,從U + 0000到U + 007F。如果使用由Encoding.ASCII屬性或ASCIIEncoding構造函數返回的默認編碼器,則在執行編碼操作之前,該範圍之外的字符將替換爲問號(?)。

1

第一步:您將unicode字符串轉換爲字符串,然後將其轉換爲ASCII(但是它是unicode)。然後,您正試圖使用​​unicode轉換器將其轉換回來。

下面的例子做一切可能使我的反應更加清晰:

static void Main(string[] args) 
    { 
     string s = "\u00C0"; 
     Console.WriteLine(s); 
     byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s); 
     Console.WriteLine(BitConverter.ToString(bytes)); 
     Console.WriteLine(ASCIIEncoding.ASCII.GetString(bytes)); 

     Console.WriteLine("Again"); 
     bytes = Encoding.UTF8.GetBytes(s); 
     Console.WriteLine(BitConverter.ToString(bytes)); 
     Console.WriteLine(Encoding.UTF8.GetString(bytes)); 

     Console.ReadLine(); 
    } 

,輸出是:

A 
3F 
? 
Again 
C3-80 
A 

順便說一句BitConverter.GetBytes的定義是:

將指定數組的 字節的每個元素的數值轉換爲其等效的六進制十進制串表示。

+0

'BitConverter.ToString(bytes)'是將字節數組轉換爲空格分隔的十六進制字符串的便捷方式。它在OP的代碼中用作簡單的方式輸出十六進制字節數組的值。 – Verax

3

看來你想要一個代表一串Unicode字符的字節序列。顯然,這些字節將取決於編碼。由於您預計C0是其中一個字節,因此會縮小選項的範圍。這裏是utf16le應按,這當然是兩個字節,因爲\u00c0完全代表一個字符BMP

string s = "\u00C0"; 
byte[] bytes = Encoding.Unicode.GetBytes(s); 
Trace.WriteLine(BitConverter.ToString(bytes)); 

你應該閱讀The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky