C# ascienceoding.ASCII.GetBytes()返回意外值

C# ascienceoding.ASCII.GetBytes()返回意外值,c#,unicode,ascii,C#,Unicode,Ascii,这个C#代码 生成以下输出: 3F 为什么输出不是C0?因为\u00c0不是ASCII(0-127范围)。因此,它被编码为问号-?(0x3F) 请参阅MSDN关于以下内容的文章: A代码对应于Windows代码页20127。因为ASCII是7位编码,所以ASCII字符被限制为最低的128个Unicode字符,从U+0000到U+007F。如果使用Encoding.ASCII属性或ascienceoding构造函数返回的默认编码器,则在执行编码操作之前,该范围之外的字符将替换为问号(?) 第一步

这个C#代码

生成以下输出:

3F

为什么输出不是C0?

因为
\u00c0
不是ASCII(0-127范围)。因此,它被编码为问号-
(0x3F)

请参阅MSDN关于以下内容的文章:

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


第一步:将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的定义是:

转换指定数组中每个元素的数值 字节转换为其等效的十六进制字符串表示形式


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

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

您应该阅读

您可能正在寻找的是
Encoding.GetEncoding(“ISO-8859-1”).GetBytes
。是的。我想知道,你为什么需要做手术?UTF8Encoding有什么问题?
BitConverter.ToString(bytes)
是将字节数组转换为空格分隔的十六进制字符串的便捷方法。在OP的代码中,它只是作为一种以十六进制输出字节数组值的方便方式使用的。
string s = "\u00C0";
byte[] bytes = Encoding.Unicode.GetBytes(s);
Trace.WriteLine(BitConverter.ToString(bytes));