尽管读取为 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 ♛ 'Pppppp' (Official & 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>
我有-
- 阅读docs.python.org/3/howto/unicode.html
- 用过
data = repr(line)
- 在打开文件时使用了
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'))
正向-反向编码只是确保所有字符现在都可以在控制台上打印(或被替换)。
我正在读取文件如下:
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 ♛ 'Pppppp' (Official & 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>
我有-
- 阅读docs.python.org/3/howto/unicode.html
- 用过
data = repr(line)
- 在打开文件时使用了
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'))
正向-反向编码只是确保所有字符现在都可以在控制台上打印(或被替换)。