【问题标题】:ASCIIEncoding.ASCII.GetBytes() Returning Unexpected ValueASCIIEncoding.ASCII.GetBytes() 返回意外值
【发布时间】:2013-04-12 05:00:53
【问题描述】:

这个 C# 代码...

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

产生以下输出:

3F

为什么输出不是C0?

【问题讨论】:

标签: c# unicode ascii


【解决方案1】:

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

请参阅 ASCIIEncoding 上的 MSDN 文章:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • BitConverter.ToString(bytes) 是一种将字节数组转换为空格分隔的十六进制字符串的便捷方法。它在 OP 的代码中仅用作以十六进制输出字节数组值的便捷方式。
      猜你喜欢
      • 2020-12-08
      • 2020-06-24
      • 1970-01-01
      • 2013-06-26
      • 2014-12-11
      • 2016-01-30
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      相关资源
      最近更新 更多