Python在有效的CP437字符上失败

时间:2016-11-12 20:28:37

标签: python file io codepages

向下箭头()是CP437编码中的有效字符。我正在编写一个需要使用此编码读取和写入文件的程序,但是当我尝试将包含此字符的字符串写入文件时,我收到以下错误:

File "C:\Python34\lib\encodings\cp437.py", line 19, in encode
   return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2193' in position 0: character maps to <undefined>

其他CP437字符也会发生同样的情况,例如。 我的代码在下面,以防我在那里做了些蠢事......

ENCODING = 'CP437'

def writeFile(name, text):
    f = open(name, 'w', encoding = ENCODING)
    f.write(text)
    f.close()

根据维基百科,它在指定的编码中有效,那为什么python告诉我呢?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您链接到的Wiki页面(位于显示向下箭头为0x19的表格上方):

  

尽管ROM为所有256种不同的8位代码提供了图形,但某些API不会打印某些代码点,特别是1-31范围和127处的代码。相反,它们会将它们解释为控制字符。例如,许多在原始IBM PC上输出文本的方法将解释BEL,BS,CR和LF的代码。许多打印机也无法打印这些字符。

您尝试编码的字符(向下箭头)与ASCII控制字符EM(中等结束)的字符相同。它在旧程序中意味着什么取决于背景。在Python中,上面引用(1-31和127)中提到的字符始终被解释为控制字符,而不是可打印的字符。

答案 1 :(得分:0)

对我来说是一个谜,但这会做你需要的吗?

f = open('somethin.txt', 'wb')
s1 = ( chr(8595)+chr(8593)+chr(8592)+chr(8594) ) . encode ( 'utf-8' )
s2 = '↓↑←→' . encode ( 'utf-8' )
f.write( s1 )
f.write( s2 )
f.close()

s1 s2 是相同的字节字符串。