尽管读为UTF-8,但无法打印Unicode字符

时间:2015-01-19 16:18:16

标签: python windows file-io python-unicode unicode-escapes

我正在阅读文件如下:

def main(src):
    with open(src, encoding='UTF-8') as incoming:
        for line in incoming:
            data = line
            print(data)
        del line

代码在此行遭到攻击(我不知道它是否会在浏览器中显示):

    <DT><A HREF="https://www.youtube.com/watch?v=-ygKS7WU4YU" ADD_DATE="1421587655">?*** EarAbuse ♛ &#39;Pppppp&#39; (Official &amp; Uncensored) - YouTube</A>

请注意 B 缺少 C hess Q ueen(即\ u265b)就在单词EarAbuse之后似乎正在造成报告中的问题 -

Traceback (most recent call last):
  File "a.py", line 18, in <module>
    moduleName.main(fileName)
  File "C:\Users\Systems\Desktop\merc\bm\chrome.py", line 53, in main
    print(data)
  File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u265b' in position
87: character maps to <undefined>

我有 -

  1. 阅读docs.python.org/3/howto/unicode.html
  2. 使用data = repr(line)
  3. 在打开文件时使用errors="surrogateescape"
  4. 没有爱。 charbase还说,BCQ的python转义是u'\u265b',它是什么意思&amp;我没有实现它吗?

    修改:奇怪的是,在IDLE中输入print('\u265b')print(♛)可以正常工作,没有任何错误&amp;显示漂亮的 BCQ - 所以有什么不对,为什么我的代码不会超出这条线?

2 个答案:

答案 0 :(得分:3)

错误(几乎)是自我解释的。它说Python试图对Windows 1252字符集中的字符串进行编码,这不能代表'\u265b'。它在空闲时工作正常,因为空闲是GUI应用程序仅受字体可以表示的字形的限制,而控制台应用程序只显示控制台代码页的256个字符。

您应该使用errors='replace'明确地将字符串转换为正确代码页中的字节数组:

for line in incoming:
    data = line
    print(data.encode('cp1252', errors='replace'))

当然它会显示?而不是,因为控制台驱动程序无法显示该UTF字符,但您不会收到任何错误。

如果您不喜欢b'...'表示您正在打印8位字符,请再次转换回字符串:

    print(data.encode('cp1252', errors='replace').decode('cp1252'))

正向反向编码只是确保所有字符现在都可以在控制台上打印(或被替换)。

答案 1 :(得分:0)

当您尝试打印BCQ字符时,会出现问题。我猜你的控制台编码/语言环境不能发出所有Unicode代码点 - 即它是ASCII或256个字符的代码页。

不要打印,请尝试:

import sys

sys.stdout.buffer.write(data.encode('utf8'))