此C#代碼...ASCIIEncoding.ASCII.GetBytes()返回意外值
string s = "\u00C0";
byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s);
Trace.WriteLine(BitConverter.ToString(bytes));
產生以下輸出:
3F
爲什麼輸出不C0?
此C#代碼...ASCIIEncoding.ASCII.GetBytes()返回意外值
string s = "\u00C0";
byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s);
Trace.WriteLine(BitConverter.ToString(bytes));
產生以下輸出:
3F
爲什麼輸出不C0?
因爲\u00c0
不是ASCII碼(0-127範圍)。結果它被編碼,就好像它是問號 - ?
(0x3F)。
參見MSDN文章:
ASCIIEncoding對應於20127. Windows的代碼頁由於ASCII是一個7位編碼,ASCII字符被限制到最低128 Unicode字符,從U + 0000到U + 007F。如果使用由Encoding.ASCII屬性或ASCIIEncoding構造函數返回的默認編碼器,則在執行編碼操作之前,該範圍之外的字符將替換爲問號(?)。
第一步:您將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的定義是:
將指定數組的 字節的每個元素的數值轉換爲其等效的六進制十進制串表示。
'BitConverter.ToString(bytes)'是將字節數組轉換爲空格分隔的十六進制字符串的便捷方式。它在OP的代碼中用作簡單的方式輸出十六進制字節數組的值。 – Verax
看來你想要一個代表一串Unicode字符的字節序列。顯然,這些字節將取決於編碼。由於您預計C0是其中一個字節,因此會縮小選項的範圍。這裏是utf16le應按,這當然是兩個字節,因爲\u00c0
完全代表一個字符BMP:
string s = "\u00C0";
byte[] bytes = Encoding.Unicode.GetBytes(s);
Trace.WriteLine(BitConverter.ToString(bytes));
您可能正在尋找'Encoding.GetEncoding( 「ISO-8859-1」) .GetBytes(多個)'。這是[只給出正好代碼點值的字節值的編碼](http://stackoverflow.com/a/15938015/995876)。 – Esailija
我想知道,爲什麼你需要ASCIIEncoding? UTF8Encoding有什麼問題? –