Python 编码☺;由于IBM-437失败,而其他有效字符,如é;成功

Python 编码☺;由于IBM-437失败,而其他有效字符,如é;成功,python,encoding,python-3.x,codepages,Python,Encoding,Python 3.x,Codepages,☺: 我想☺ 带我回来b'\x01'。我怎样才能证明这一点 IBM-437有点特殊,因为它不仅是一个代码页(即定义字节值128-255应该发生什么),而且还重新定义了一些ASCII控制字符。Python将这些有问题的代码点映射到控制字符,而不是在某些上下文中显示的可见字符 要转换,可以使用以下帮助器方法: >>> bytes('é','ibm437') b'\x82' 是否u'☺'.编码('ibm437')在Python 3中工作?(在Python 2中是这样的。)@Came

☺:

我想☺ 带我回来
b'\x01'
。我怎样才能证明这一点


IBM-437有点特殊,因为它不仅是一个代码页(即定义字节值128-255应该发生什么),而且还重新定义了一些ASCII控制字符。Python将这些有问题的代码点映射到控制字符,而不是在某些上下文中显示的可见字符

要转换,可以使用以下帮助器方法:

>>> bytes('é','ibm437')
b'\x82'

是否
u'☺'.编码('ibm437')
在Python 3中工作?(在Python 2中是这样的。)@Cameron:OP就是这么做的..嗯。好像是
'☺'在Python 2中被解释为
'\x01'
,在Python 3中被解释为
'\u263a'
。IBM 437代码页代码点1-31通常是控制代码(在许多情况下,它们将一对一映射为ASCII);只有在视频环境中才会映射到笑脸;它也有一个IBM437编解码器。谢谢你的翻译表。我有一个与OP类似的问题:我想在java中从437转换为utf-8,似乎java没有将0x01转换为
也是。
>>> bytes('é','ibm437')
b'\x82'
ibm437_visible = lambda byt: byt.decode('ibm437').translate({
    0x01: "\u263A", 0x02: "\u263B", 0x03: "\u2665", 0x04: "\u2666",
    0x05: "\u2663", 0x06: "\u2660", 0x07: "\u2022", 0x08: "\u25D8",
    0x09: "\u25CB", 0x0a: "\u25D9", 0x0b: "\u2642", 0x0c: "\u2640",
    0x0d: "\u266A", 0x0e: "\u266B", 0x0f: "\u263C", 0x10: "\u25BA",
    0x11: "\u25C4", 0x12: "\u2195", 0x13: "\u203C", 0x14: "\u00B6",
    0x15: "\u00A7", 0x16: "\u25AC", 0x17: "\u21A8", 0x18: "\u2191", 
    0x19: "\u2193", 0x1a: "\u2192", 0x1b: "\u2190", 0x1c: "\u221F",
    0x1d: "\u2194", 0x1e: "\u25B2", 0x1f: "\u25BC", 0x7f: "\u2302",
})
assert ibm437_visible(b'\x01') == '☺'