如何将Unicode字符转换为其等效的ASCII
这是问题所在:
在CI中,是从旧版ACCESS数据库中获取信息。在将内容交给我之前,.NET将数据库的内容(在这种情况下为字符串)转换为Unicode。
如何将该Unicode字符串转换回等效的ASCII?
编辑
Unicode字符710确实是修饰符字母圆圈重音。这是更精确的问题:
-> (Extended) ASCII character ê (Extended ASCII 136) was inserted in the database. -> Either Access or the reading component in .NET converted this to U+02C6 U+0065 (MODIFIER LETTER CIRCUMFLEX ACCENT + LATIN SMALL LETTER E) -> I need the (Extended) ASCII character 136 back.
这是我尝试过的方法(现在我知道为什么它不起作用了……):
string myInput = Convert.ToString(Convert.ToChar(710)); byte[] asBytes = Encoding.ASCII.GetBytes(myInput);
但这不会导致94而是一个值63的字节...
这是一种新尝试,但仍然无法正常工作:
byte[] bytes = Encoding.ASCII.GetBytes("ê");
解决
感谢csgero和bzlm都指出了正确的方向,所以我在这里解决了这个问题。
解决方案
唔?我不确定我们是指哪个角色。脱字号(^,CIRCUMFLEX ACCENT)在ASCII和Unicode(U + 005E)中具有相同的代码。
/编辑:该死,我的错。 710(U + 02C6)实际上是修饰符字母圆圈重音。不幸的是,这个字符根本不是ASCII的一部分。它可能看起来像普通的插入符号,但它是一个不同的字符。简单转换在这里无济于事。我不确定从Unicode转换时.NET是否支持相似字符的映射。不过值得调查。
值63是问号,也就是"我无法以ASCII显示此字符"。
我们不能在此处使用默认的ASCII编码(Encoding.ASCII),但必须使用Encoding.GetEncoding(...)使用适当的代码页创建编码。我们可能会尝试使用代码页1252,它是ISO 8859-1的超集。
ASCII没有定义;数字136来自8位编码(例如Windows-1252)中的抑扬符的数字。
在这种情况下,我们可以验证带有抑扬符()的小e实际上应该存储在Access数据库中吗? U + 02C6 U + 0065可能是转换错误的结果,其中输入实际上是e,后跟抑音符,或者完全是其他东西。可能是由于指定的编码与内容不匹配,Access数据库中的数据已损坏,在这种情况下,.NET客户端可能会错误地解析数据(使用错误的解码器)。
如果从数据库读取过程中确实引入了此错误,则也许粘贴一些代码或者配置设置可能会有所帮助。
在代码页437中,字符编号136是带抑扬符号的e。
好吧,让我们详细说明。 csgero和bzlm都指向正确的方向。
由于blzm的回复,我在Wiki上查找了Windows-1252页面,发现它称为代码页。有关"代码"页面的维基百科文章,内容如下:
No formal standard existed for these ‘extended character sets’; IBM merely referred to the variants as code pages, as it had always done for variants of EBCDIC encodings.
这使我进入了代码页437:
n ASCII-compatible code pages, the lower 128 characters maintained their standard US-ASCII values, and different pages (or sets of characters) could be made available in the upper 128 characters. DOS computers built for the North American market, for example, used code page 437, which included accented characters needed for French, German, and a few other European languages, as well as some graphical line-drawing characters.
因此,代码页437是我称为"扩展ASCII"的代码页,它的字符为136,所以我也查找了其他一些字符,它们看起来是正确的。
csgero带有Encoding.GetEncoding()提示,我用它来创建以下语句来解决我的问题:
byte[] bytes = Encoding.GetEncoding(437).GetBytes("ê");