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

Unable to print Unicode char despite reading as UTF-8

我正在读取文件如下:

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缺少Chess Queen(即\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"

没有爱。 charbase 还说 BCQ 的 python 转义是 u'\u265b',这是什么意思,我还没有实现它吗?

编辑: 奇怪的是,在 IDLE 中输入 print('\u265b')print(♛) 工作正常,没有任何错误并显示 beautiful BCQ - 怎么了,为什么我的代码不能读取超出这一行的内容?

当您尝试打印 BCQ 字符时出现问题。我猜想您的控制台 encoding/locale 无法发出所有 Unicode 代码点 - 即它是 ASCII 或 256 个字符的代码页。

不打印,试试:

import sys

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

该错误(几乎)是不言自明的。它说 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'))

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