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

C# 为什么值为128的字符是空字符串而不是欧元符号€;,c#,char,ascii,C#,Char,Ascii,在这里的ASCII表后面,128的值是a €但是,在C#中执行以下代码不会返回欧元符号 char expectedEuro = Convert.ToChar(128); 尝试将€字符转换为字符时,总是会导致溢出异常,因为它对于无符号字节来说太大 Convert.ToByte(`€`); 当值为128但C#输出空字符时,另一个系统的编码会输出€字符,这会导致问题 有什么解释吗?我能做些什么来解决这个问题吗?C#/.NET使用Unicode字符,所以€符号是8364 您可以通过以下方式进行检查:

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

char expectedEuro = Convert.ToChar(128);
尝试将
字符转换为字符时,总是会导致
溢出异常,因为它对于无符号字节来说太大

Convert.ToByte(`€`);
当值为128但C#输出空字符时,另一个系统的编码会输出
字符,这会导致问题

有什么解释吗?我能做些什么来解决这个问题吗?

C#/.NET使用Unicode字符,所以
符号是
8364

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

int val = (int)'€'; // val will be 8364
这也意味着不能将
字符
表示为一个
字节
,因为大多数字符需要2个字节

如果要使用扩展ASCII表,可以使用
编码。默认值

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

使用当前的ANSI代码页(请参阅Joe的答案或Jeppe的注释以选择特定的代码页)并使用7位ASCII表,因此在
ASCII
中没有
128
,ASCII是7位编码:链接的表描述了欧元字符的一种特定编码

如果您希望对欧元符号进行编码,以便其他系统能够识别它,您可能希望使用合适的编码对其进行编码,例如:

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

Convert.ToChar(128)//返回€
Convert.ToByte(Convert.ToChar(128))//返回128
我不理解您的问题?感谢C#和.NET以及整个IT行业已经转向Unicode。(事实上,我很多年前就这样做了。)我已经足够大了,能够记得上世纪70年代和80年代所有不兼容字符集、ASCII与EBCDIC与代码页等永无休止的疯狂问题。ASCII库或系统是罕见的。当您发现自己在思考“ASCII”时,请停止并确定实际的字符集和编码是什么。对于.NET库,文件流几乎总是Unicode/UTF-16(以机器字节顺序)或Unicode/UTF-8。因此,您必须确定其他系统使用的字符集/编码,然后使用
编码
类进行正确转换。这是正确的解释。在Unicode下,十进制128或U+0080是“PAD–Padding Character”C1控制字符,请参阅。另外:请参阅欧元登录。此外,询问者链接到的页面确实给出了非Unicode的。不应将Windows-1252特定的代码点与.NET.Encoding一起使用。默认值不一定是CP1252,因此要在国际范围内工作,您应该明确指定所需的编码。警告:使用
编码的技巧。默认值将为操作系统提供本机代码页。对于“西欧语言”版本的Windows,它将是Windows-1252,但如果代码在保加利亚语或希腊语版本的Windows上运行,它将提供另一个代码页。因此使用
编码更安全。GetEncoding(“Windows-1252”)
@Joe:谢谢,刚刚把它添加到了答案中。