CP437解码是否因控制字符而被破坏?

时间:2017-10-25 21:59:05

标签: python character-encoding

根据Wikipedia page for Code Page 437,字节值\x01\x1f应解码为图形字符,例如b'\x01'等同于'\u263A'。但那不是decode产生的:

>>> b'\x01'.decode('cp437')
'\x01'

对于所有31个字节的值,这是Python 3.6但2.7也是如此。

2 个答案:

答案 0 :(得分:4)

虽然存在与字节范围\x01\x1f相关联的图形,但这些图形仅在某些上下文中使用。在其他情况下,这些代码点将被解释为控制字符,如ASCII中所示。引用IBM page on CP437

  

代码点X'01'到X'1F'和X'7F'可以是取决于上下文的控件或图形。用于在内存映射中显示十六进制代码   视频显示缓冲区是一个图形。对于打印机,图形上下文由数据流中的前一控制序列建立。那里有两个   这样的控制序列:ESC X'5C'和ESC X'5E'分别命名为Print All Characters和Print Single Character。在其他情况下的代码   有问题的点被用作对照。

Python的CP437解码基于Unicode mappings on Unicode.org,它使用控制字符解释。

Unicode FAQ implies“CP437和其他DOS类型代码页的特殊图形字符(01-1F,7F)的正确Unicode映射”应该在https://www.unicode.org/Public/MAPPINGS处可用,但需要深入研究只有控制字符出现映射,并且page链接到几个IBM网站。通过IBM的网站进行挖掘ftp://ftp.software.ibm.com/software/globalization/gcoc/attachments/CP00437.txt,它提供了\x01 - \x1f在IBM GCGID system方面的图形映射,但不包括Unicode。

我不知道是否是来自IBM还是Unicode的官方映射,它为\x01 - \x1f提供了规范的Unicode映射。 CP437的图形解释。

答案 1 :(得分:0)

我设法在此找到该文件:
https://unicode.org/Public/MAPPINGS/VENDORS/MISC/IBMGRAPH.TXT

它包括Unicode字符(0x01-0x1f)到IBM CP437以及IBM CP864(阿拉伯语)的映射。