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

时间:2013-04-12 05:00:53

标签: c# unicode ascii

这个C#代码......

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

产生以下输出:

3F

为什么输出不是C0?

3 个答案:

答案 0 :(得分:4)

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

请参阅ASCIIEncoding上的MSDN文章:

  

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

答案 1 :(得分:4)

您似乎想要一个表示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

答案 2 :(得分:1)

第一步:将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

Btw BitConverter.GetBytes的定义是:

  

转换指定数组的每个元素的数值   字节到它等效的十六进制字符串表示。