为什么值为128的char为空字符串而不是欧元符号€

use*_*722 2 c# ascii char

在这里的asci表之后的ASCII表中,128的值是a
但是在C#中执行以下代码并不返回欧元符号

char expectedEuro = Convert.ToChar(128);
Run Code Online (Sandbox Code Playgroud)

尝试将字符转换为字符总是会产生一个OverflowException因为它对于无符号字节而言太大

Convert.ToByte(`€`);
Run Code Online (Sandbox Code Playgroud)

这会导致问题,因为当值为128但C#输出空字符时,来自另一个系统的编码 输出字符.

有没有解释这个以及我可以做些什么来解决这个问题?

Chr*_*Fin 11

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

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

int val = (int)'€'; // val will be 8364
Run Code Online (Sandbox Code Playgroud)

这也意味着您不能将其表示char为一个,byte因为大多数都需要2个字节.

如果要使用扩展ASCII表,可以使用Encoding.Default:

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

Encoding.Default使用当前的ANSI代码页(见乔的回答了Jeppe或的评论来选择特定的一个),并Encoding.ASCII使用7位ASCII表,所以没有128ASCII.

  • Encoding.Default不一定是CP1252,所以要在国际上工作,你应该明确指定你想要的编码. (4认同)
  • 警告:使用`Encoding.Default`的技巧将为操作系统提供原生代码页.对于Windows的"西欧语言"版本,它将是Windows-1252,但如果代码在保加利亚语或希腊语版本的Windows上运行,则会提供另一个代码页.因此使用`Encoding.GetEncoding("Windows-1252")`更安全. (2认同)