问题 如何将Unicode字符转换为其ASCII等效字符


这是问题所在:

在C#中,我从传统的ACCESS数据库中获取信息。在将内容交给我之前,.NET将数据库的内容(在此问题的情况下为字符串)转换为Unicode。

如何将此Unicode字符串转换回其ASCII等效字符串?


编辑
Unicode char 710确实是MODIFIER LETTER CIRCUMFLEX ACCENT。这里的问题更加精确:

  - >(扩展)ASCII字符ê(扩展ASCII 136)已插入数据库中。
  - > Access或.NET中的读取组件将其转换为U + 02C6 U + 0065
    (MODIFIER LETTER CIRCUMFLEX ACCENT + LATIN SMALL LETTER 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 为了指向正确的方向我解决了问题 这里


6047
2017-09-26 09:25


起源

术语“扩展ASCII”令人困惑。如果您的输入数据确实是ASCII,则没有ë或“字符编号136”。您的数据更有可能包含ASCII无法表示的字符,例如可通过Windows-1252等传统8位编码表示的国际数据。 - bzlm
我知道,有一篇关于该主题的维基百科文章。 - Huppie
您应该将解决方案作为答案而不是问题发布,以便我们能够投票。 - Thomas Danecker
@Thomas Danecker:完成了。 - Huppie


答案:


好的,让我们详细说明。都 csgero 和 bzlm 指向正确的方向。

由于blzm的回复,我在wiki上查找了Windows-1252页面,发现它被称为代码页。维基百科的文章 代码页 其中陈述如下:

这些'没有正式的标准'扩展字符集“; IBM仅将这些变体称为代码页,因为它一直用于EBCDIC编码的变体。

这导致我进入代码页437:

n与ASCII兼容的代码页,低128个字符保持其标准的US-ASCII值,并且可以在高128个字符中提供不同的页面(或字符集)。例如,用于北美市场的DOS计算机 代码页437,其中包括法语,德语和其他一些欧洲语言所需的重音字符,以及一些图形线条绘制字符。

因此,代码页437是我称之为“扩展ASCII”的代码页,它具有ê作为字符136所以我也查找了其他一些字符,它们似乎正确。

csgero附带了Encoding.GetEncoding()提示,我用它来创建以下语句来解决我的问题:

byte[] bytes = Encoding.GetEncoding(437).GetBytes("ê");

9
2017-09-26 20:37



请参阅Unicode规范化主题,特别是两种形式的等价:规范和兼容性 - en.wikipedia.org/wiki/Unicode_normalization  在.NET String实例上,调用Normalize方法,传递NormalizationForm.FormD或NormalizationForm.FormKD,它们对应于规范和兼容性 分解 形式。例如,在类似“êwś”的字符串上调用它,将生成字符串“e ^ ws”。你也可以反过来,通过调用Normalize(NormalizationForm.FormC)或Normalize(NormalizationForm.FormKC)将像“e ^”这样的字符串转换为“ê”。 - Triynko


您不能在此处使用默认的ASCII编码(Encoding.ASCII),但必须使用Encoding.GetEncoding(...)在适当的代码页中创建编码。您可以尝试使用代码页1252,它是ISO 8859-1的超集。


3
2017-09-26 10:05



像这样:byte [] bytes = Encoding.GetEncoding(437).GetBytes(“ê”); - Huppie


ASCII没有定义ê;数字136来自8位编码(例如Windows-1252)中的抑扬数。

在这种情况下,您能否验证带有抑扬符(ê)的小e实际上应该存储在Access数据库中?也许U + 02C6 U + 0065是转换错误的结果,其中输入实际上是e 其次是 一种旋风,或完全不同的东西。在指定的编码与内容不匹配的意义上,您的Access数据库可能存在损坏的数据,在这种情况下,.NET客户端可能会错误地解析数据(使用错误的解码器)。

如果在从数据库读取期间确实引入了此错误,则可能粘贴某些代码或配置设置可能会有所帮助。

代码页437,字符编号136是具有抑扬符的e。


2
2017-09-26 10:06



谢谢!你的提示帮了很多,实际上是代码页437(MS-DOS)。使用Encoding.GetEncoding(437)它有效。 - Huppie


嗯......我不确定你指的是哪个角色。插入符号(“^”,CIRCUMFLEX ACCENT)在ASCII和Unicode(U + 005E)中具有相同的代码。

/编辑:该死的,我的错。 710(U + 02C6)实际上是MODIFIER LETTER CIRCUMFLEX ACCENT。不幸的是,这个字符根本不是ASCII的一部分。它可能看起来像普通的插入符号,但它是一个不同的角色。简单的转换在这里无济于事。我不确定.NET是否支持从Unicode转换时类似字符的映射。值得调查一下。


0
2017-09-26 09:29



我刚刚编辑了帖子以反映OP的含义。 :-) - Chris Jester-Young
Unicode!= UTF-8 - OJ.
OJ:这与UTF-8有什么关系? - Chris Jester-Young
@OJ,我知道这一点。但是,字符的代码点在所有Unicode编码中都是相同的。 - Konrad Rudolph
@Chris:在Konrad的原始帖子中,他谈到了UTF8,而不是Unicode。 - OJ.


值63是问号,AKA“我无法以ASCII显示该字符”。


0
2017-09-26 09:36



所以,你正在查明我的问题。问题是我如何做到这一点,我知道我尝试的方法不起作用。 - Huppie