C#将ALT + <xxx>代码映射到字符

时间:2016-05-05 19:18:27

标签: c# windows unicode

我正在尝试创建一个脚本来创建一个alt代码表。 例如,在Windows上,键组合ALT + 227打印字符π,ALT + 7899打印█,依此类推。

我已尝试过多种方式在C#中访问这些数据,但每种方法似乎都提出了不同的值。将227转换为Character不会产生π,也不会使用System.Text编码选项。

如何正确地将alt代码映射到字符?

1 个答案:

答案 0 :(得分:2)

所有这些Alt-XXX事物都是从Unicode之前的日子开始的。在MS-DOS的时代,字符代码是8位,并且该组合输入字符号XXX。美国,加拿大和西欧的PC用户使用IBM PC的原始字符集,后来称为代码页437.其他国家/地区的PC用户使用其他代码页(例如,前苏联 - 西里尔字母代码页866或中欧代码页852 )。文本模式屏幕使得必须具有伪码码。

在设计Windows时,Microsoft决定引入自己的一组代码页,使字符的位置更加一致;此外,Windows以图形模式运行,因此不需要伪写代码点,为更多字符字形留出空间。然而,当时,角色仍然大多数是8位(因为内存很珍贵),Unicode只是未来的光明前景,并且不存在强大的编码方法,如UTF-8。因此,不同的国家仍然需要不同的代码页。 Windows严重依赖MS-DOS并允许运行MS-DOS程序;还有,很多用户习惯了Alt + XXX技巧。因此,Windows配置现在包括两个代码页:MS-DOS应用程序(以及后来的Windows控制台应用程序)的所谓OEM(原始设备制造商)代码页,以及Windows应用程序的所谓ANSI代码页(因为Microsoft管理)让他们通过ANSI标准化。例如,美国的计算机通常配置为OEM代码页437和ANSI代码页1252;俄罗斯的计算机,OEM 866和ANSI 1251.为了避免用户过多地考虑代码页,Windows在Windows应用程序中处理熟悉的Alt + XXX键击时,会自动将它们从OEM重新映射到ANSI。此外,Alt + 0XXX是为那些想要利用新ANSI字符的人而推出的。

您可能会惊讶地发现所有这一切仍然存在!即使我们现在拥有Unicode,UTF-8和其他好东西,我们的系统仍然有两个代码页的概念,用于与仍然使用8位字符代码的应用程序兼容,OEM用于控制台,ANSI用于图形模式。如果您检查代码页437,您会发现它在位置227中包含π。并且,如果代码页437被配置为您的OEM代码页,则Alt + 227输入π。在我的计算机上,Alt + 227进入了(Cyrillic),因为我的计算机配置为OEM代码页866.

现在,为什么Alt + 7899进入█?原始IBM PC键盘中断处理程序没有处理数字溢出,因此,当您输入Alt + 7899时,它诚实地计算(char)(((7 * 10 + 8) * 10 + 9) * 10 + 9)(NB:char为8位!),它给出了219. Codepoint 219在代码页中437是█。此溢出逻辑仍保留在现代Windows系统中。

这个故事不完整,因为在远东语言中,这不适合单个字节,所有这些都可能是错误的。

现在,你问题的答案是什么?您需要将系统OEM代码页中的codepoint XXX映射到Unicode。 System.Text.Encoding.GetEncoding(System.Globalization.CultureInfo.CurrentCulture.TextInfo.OEMCodePage)(或者,在控制台应用程序中也System.Console.OutputEncoding)返回计算机OEM代码页的System.Text.Encoding类实例。然后,GetChars方法将OEM代码点转换为Unicode代码点。