如何将一个Unicode字符转换为它的ASCII等效
这是问题:
在C#中,我从传统的ACCESS数据库获取信息。 在将内容交给我之前,.NET会将数据库的内容(在这种情况下是一个string)转换为Unicode。
如何将这个Unicodestring转换回它的ASCII码?
编辑
Unicode char 710的确是MODIFIER LETTER CIRCUMFLEX ACCENT。 这个问题更精确一些:
- >(扩展的)ASCII字符ê(扩展ASCII 136)被插入到数据库中。 - > Access或.NET中的读取组件将其转换为U + 02C6 U + 0065 (MODIFIER LETTER CIRCUMFLEX ACCENT + LATIN小字母E) - >我需要(扩展的)ASCII字符136回来。
这是我所尝试过的(我现在看到为什么这不起作用…):
string myInput = Convert.ToString(Convert.ToChar(710)); byte[] asBytes = Encoding.ASCII.GetBytes(myInput);
但是这不会导致94,而是一个值63的字节…
这是一个新的尝试,但它仍然无法正常工作:
byte[] bytes = Encoding.ASCII.GetBytes("ê");
Soltution
感谢csgero和bzlm指向正确的方向我在这里解决了这个问题。
好的,我们来详细说一下。 csgero和bzlm都指向正确的方向。
由于blzm的回复,我查阅了wiki上的Windows-1252页面,发现它被称为代码页。 代码页的维基百科文章说明如下:
这些“ 扩展字符集 ”没有正式的标准。 IBM仅仅将这些变体称为代码页,就像它一直为EBCDIC编码的变体所做的那样。
这导致我的代码页437:
n与ASCII兼容的代码页,低128个字符保持其标准的US-ASCII值,并且可以在高128个字符中提供不同的页面(或字符集)。 例如,为北美市场build造的DOS计算机使用代码页437 ,其中包括法语,德语和其他一些欧洲语言所需的重音字符,以及一些graphics化的线条字符。
因此,代码页437是我所称的“扩展ASCII”的代码页,它具有136的字符,所以我查了一些其他的字符,他们似乎是正确的。
csgero附带了Encoding.GetEncoding()提示,我用它来创build下面的语句来解决我的问题:
byte[] bytes = Encoding.GetEncoding(437).GetBytes("ê");
您不能在这里使用默认的ASCII编码(Encoding.ASCII),但是必须使用Encoding.GetEncoding(…)使用适当的代码页创build编码。 您可能会尝试使用代码页1252,它是ISO 8859-1的超集。
ASCII不定义ê; 数字136来自8位编码(例如Windows-1252)中的音调编号。
你可以validation一个带有callback(ê)的小型e实际上应该存储在Access数据库中吗? 也许U + 02C6 U + 0065是转换错误的结果,其中input实际上是一个后面跟着一个旋律或其他东西。 也许你的Access数据库在指定的编码与内容不匹配的意义上有损坏的数据,在这种情况下,.NET客户端可能会错误地parsing数据(使用错误的解码器)。
如果在从数据库读取期间确实引入了这个错误,则可能粘贴一些代码或configuration设置可能会有所帮助。
在代码页437中 ,字符数字136是一个有回音的e。
嗯…我不确定你的意思。 插入符号(“^”,CIRCUMFLEX ACCENT)在ASCII和Unicode(U + 005E)中具有相同的代码。
/编辑:该死的,我的错。 710(U + 02C6)实际上是修饰字母CIRCUMFLEX ACCENT。 不幸的是,这个字符根本不是ASCII的一部分。 它可能看起来像正常的插话,但它是一个不同的性格。 简单的转换在这里没有帮助。 我不确定.NET在从Unicode转换时是否支持类似字符的映射。 值得调查,但。
值63是问号,AKA“我不能用ASCII显示这个字符”。