ASCIIEncoding.ASCII.GetBytes()返回意外值

这个C#代码……

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

产生以下输出:

 3F 

为什么输出不是C0?

因为\u00c0不是ASCII(0-127范围)。 结果它编码好像是问号 – ? (0x3F的)。

有关ASCIIEncoding的信息,请参阅MSDN文章:

ASCIIEncoding对应于Windows代码页20127.由于ASCII是7位编码,因此ASCII字符限制为最低128个Unicode字符,从U + 0000到U + 007F 。 如果使用Encoding.ASCII属性或ASCIIEncoding构造函数返回的默认编码器,则在执行编码操作之前,该范围之外的字符将替换为问号(?)

您似乎需要一个表示Unicode字符串的字节序列。 显然,字节将取决于编码。 由于您希望C0是其中一个字节,因此它会将选项缩小一点。 这是UTF16LE,当然是两个字节,因为\u00c0完全代表一个BMP字符:

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

您应该阅读Joel Spolsky绝对必须知道的关于Unicode和字符集的绝对最低要求(无需借口!)

第一步:将unicode char分配给字符串,然后将其转换为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的定义是:

将指定字节数组的每个元素的数值转换为其等效的hex字符串表示forms。