IBM-437 有点特殊,因为它不仅是一个代码页(即定义字节值 128-255 应该发生什么),而且还重新定义了一些 ASCII 控制字符,但仅在某些情况下 http://en.wikipedia.org/wiki/Code_page_437#Interpretation_of_code_points_1.E2.80.9331_and_127。 Python 将这些有问题的代码点映射到控制字符,而不是映射到它们在某些上下文中显示的可见字符。
要进行转换,您可以使用以下辅助方法:
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') == '☺'