3

这个 C# 代码...

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

产生以下输出:

3F

为什么输出不是C0?

4

3 回答 3

4

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

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

您应该阅读Joel Spolsky 所著的《每个软件开发人员绝对、肯定必须了解 Unicode 和字符集(没有借口!)的绝对最低要求》

于 2013-04-12T05:25:59.363 回答
4

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

请参阅有关ASCIIEncoding的 MSDN 文章:

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

于 2013-04-12T05:04:08.237 回答
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

顺便说一句,BitConverter.GetBytes 的定义是:

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

于 2013-04-12T05:09:07.687 回答