14

这是问题所在:

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

如何将此 Unicode 字符串转换回它的 ASCII 等价物?


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

-> (Extended) ASCII 字符 ê (Extended ASCII 136) 被插入到数据库中。
 -> Access 或 .NET 中的读取组件将其转换为 U+02C6 U+0065
    (修饰符字母 CIRCUMFLEX ACCENT + 拉丁文小写字母 E)
 -> 我需要(扩展的)ASCII 字符 136。


这是我尝试过的(我现在明白为什么这不起作用......):

string myInput = Convert.ToString(Convert.ToChar(710));
byte[] asBytes = Encoding.ASCII.GetBytes(myInput);

但这不会导致 94 而是一个值为 63 的字节......
这是一个新的尝试,但它仍然不起作用:

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


解决方案
感谢csgerobzlm指出正确的方向,我在这里解决了问题。

4

5 回答 5

11

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

由于 blzm 的回复,我在 wiki 上查找了 Windows-1252 页面,发现它被称为代码页。代码页面的维基百科文章说明了以下内容:

这些'<a href="http://en.wikipedia.org/wiki/Extended_ASCII" rel="nofollow noreferrer">扩展字符集'没有正式的标准;IBM 只是将这些变体称为代码页,就像它一直对 EBCDIC 编码的变体所做的那样。

这导致我进入代码页 437:

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

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

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

byte[] bytes = Encoding.GetEncoding(437).GetBytes("ê");
于 2008-09-26T20:37:17.027 回答
4

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

于 2008-09-26T10:05:18.757 回答
2

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

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

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

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

于 2008-09-26T10:06:11.810 回答
0

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

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

于 2008-09-26T09:29:29.823 回答
0

值 63 是问号,又名“我无法以 ASCII 显示此字符”。

于 2008-09-26T09:36:04.787 回答