我正在阅读文件如下:
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 缺少 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>
我有 -
data = repr(line)
errors="surrogateescape"
没有爱。 charbase还说,BCQ的python转义是u'\u265b'
,它是什么意思&amp;我没有实现它吗?
修改:奇怪的是,在IDLE中输入print('\u265b')
或print(♛)
可以正常工作,没有任何错误&amp;显示漂亮的 BCQ - 所以有什么不对,为什么我的代码不会超出这条线?
答案 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'))