【问题标题】:Unable to print Unicode char despite reading as UTF-8尽管读取为 UTF-8,但无法打印 Unicode 字符
【发布时间】:2015-03-17 17:16:28
【问题描述】:

我正在阅读如下文件:

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(♛) 可以正常工作,没有任何错误,并表明 漂亮 BCQ - 那么有什么问题,为什么会失败'我的代码是否超出了这一行?

【问题讨论】:

  • 这不是文件的问题。这是您尝试print() 的终端的问题。您的终端正在使用charmap 编解码器,可能是因为您使用的是 Windows。

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


【解决方案1】:

这个错误(几乎)是不言自明的。它说 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(ed),我一定会从您的回答中学习,但需要一些时间才能完全消化它。另外,你怎么知道是Windows 1252
  • @user4453945 :从您的错误消息File "...\cp1252.py" 我假设Python 试图在win1252 中编码。但我必须承认我不是很确定。但是控制台中的chcp 显示当前代码页。
  • 不错不错。还有一件事 - 如果你能抽出一些时间发布一个小答案,如何培养良好的“错误阅读”能力?
  • 对于 Windows 8+,在启动 Python 之前使用chcp 65001 将控制台设置为 UTF-8。确保控制台使用的是 truetype 字体,例如 Consolas。但是不要在 Windows XP、Vista 或 7 上使用它。旧的控制台服务器对于多字节编码来说是错误的。而是尝试使用 Drekin 的 win-unicode-console 来使用控制台的原生 UTF-16 编码。
【解决方案2】:

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

不要打印,试试:

import sys

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

【讨论】:

  • 当然,这可能会给你mojibake在一个实际上没有使用UTF-8的终端上...
  • 是的 - 只是试图将 OP 指向正确的方向,而不知道该人在什么环境中工作。
  • 感谢@user5402,支持或不支持我的代码需要在终端上显示一些东西——这解决了我的问题。另外,请为此问题建议一个更好的标题,以便将来对其他人有所帮助
  • 可能是“无法打印 Unicode 字符,尽管读取为 UTF-8”,因为打印确实是您的程序失败的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2015-05-20
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
相关资源
最近更新 更多