【问题标题】:Why is a char with a value of 128 an empty string and not a Euro sign €为什么值为 128 的字符是空字符串而不是欧元符号 €
【发布时间】:2014-06-27 02:18:03
【问题描述】:

按照此处的 ASCII 表 asci table 128 的值是 a
但是在 C# 中执行以下代码不会返回欧元符号

char expectedEuro = Convert.ToChar(128);

尝试将 字符转换为 Char 总是会导致 OverflowException,因为它对于无符号字节来说太大了

Convert.ToByte(`€`);

这会导致问题,因为当值为 128 但 C# 输出空字符时,我们从另一个系统编码输出 字符。

是否有对此的解释以及我可以做些什么来解决这个问题?

【问题讨论】:

  • Convert.ToChar(128) // returns € Convert.ToByte(Convert.ToChar(128)) // returns 128我不明白你的问题?
  • 感谢 C# 和 .NET 以及整个 IT 行业已切换到 Unicode。 (事实上​​,很多年前就这样做了。)我已经足够大,可以记住所有 1970 年代不兼容的字符集和 ASCII 与 EBCDIC 与代码页等永无止境的疯狂问题1980 年代。
  • ASCII 库或系统很少见。当您发现自己在思考“ASCII”时,请停下来确定实际的字符集和编码是什么。对于 .NET 库,文件流几乎总是 Unicode/UTF-16(按机器字节顺序)或 Unicode/UTF-8。因此,您必须确定其他系统使用什么字符集/编码,然后使用 Encoding 类进行正确转换。

标签: c# char ascii


【解决方案1】:

C#/.NET 使用 Unicode 字符,因此 符号为 8364

您可以通过以下方式进行检查:

int val = (int)'€'; // val will be 8364

这也意味着您不能将 char 表示为一个 byte,因为它们中的大多数需要 2 个字节。

如果你想使用扩展的 ASCII 表你可以使用Encoding.Default:

var valStr = Encoding.Default.GetString(new byte[] { 128 }); // valStr = €
var valByte = Encoding.Default.GetBytes("€"); // valByte[0] = 128

Encoding.Default 使用当前的 ANSI 代码页(请参阅 Joe 的回答或 Jeppe 的评论来选择一个特定的),Encoding.ASCII 使用 7 位 ASCII 表,因此没有 @987654335 @在ASCII.

【讨论】:

  • 这是正确的解释。在 Unicode 下,十进制 128 或 U+0080 是“PAD – 填充字符”C1 控制字符,请参阅Latin-1 Supplement补充:Currency Symbols block 中查看欧元符号。
  • 此外,提问者链接到的页面确实给出了Windows 1252 codepage,这是不是 Unicode。不应将 Windows-1252 特定代码点与 .NET 一起使用。
  • Encoding.Default 不一定是 CP1252,因此要在国际范围内工作,您应该明确指定所需的编码。
  • 警告:Encoding.Default 的技巧将使代码页原生于操作系统。对于“西欧语言”版本的 Windows,它将是 Windows-1252,但如果代码在保加利亚语或希腊语版本的 Windows 上运行,它将提供另一个代码页。因此使用Encoding.GetEncoding("Windows-1252")更安全。
  • @Joe:谢谢,刚刚添加到答案中。
【解决方案2】:

ASCII 是一种 7 位编码:您链接的表描述了欧元字符的一种特定编码。

如果您想对欧元符号进行编码以使其被其他系统识别,您可能需要使用合适的编码对其进行编码,例如:

var v = System.Text.Encoding.GetEncoding(1252).GetBytes("€");
Console.WriteLine(Convert.ToByte(v[0])); // = 128

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 2011-11-24
    • 1970-01-01
    • 2020-06-02
    • 2012-06-20
    • 2018-09-15
    • 1970-01-01
    • 2023-02-15
    • 2020-11-12
    相关资源
    最近更新 更多