读取Unicode文件 - Python3.2

3

我正在尝试使用Python3.2读取一些文件,其中有些文件可能包含Unicode编码,而其他文件则不包含。

当我尝试执行以下代码时:

file = open(item_path + item, encoding="utf-8")
for line in file:
    print (repr(line))

我遇到了一个错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 13-16: ordinal not in range(128)

我正在遵循这里的文档:http://docs.python.org/release/3.0.1/howto/unicode.html
为什么Python在代码的任何时候都要尝试将其编码为ascii?

2
清楚地说:当你在这里写Unicode时,你是指UTF-8吗?此外,听起来所有的文件都是UTF-8,但有些可能只包含ASCII子集。 - Andrew Aylett
https://dev59.com/gUfSa4cB1Zd3GeqPBvg3#983752 - pylover
2个回答

3
问题在于Python 3中的repr(line)也返回Unicode字符串。它不会将上述128个字符转换为ASCII转义序列。
如果想看到转义序列,请使用ascii(line)
实际上,期望repr(line)返回的是一个字符串,如果将其放置在源代码中,则会产生具有相同值的对象。因此,在表达具有超过ASCII字符的字符串时,源文件中不需要使用ASCII转义序列,使用UTF-8或其他一些Unicode编码是非常自然的选择。事实上,Python 2对这些字符产生了转义序列。

2

你的输出编码是什么?如果你删除对print()的调用,它会开始工作吗?

我怀疑你使用的是非UTF-8语言环境,因此Python正在尝试将repr(line)编码为ASCII格式以便打印。

要解决这个问题,你必须要么对字符串进行编码并打印字节数组,要么将默认编码设置为能够处理字符串的编码(UTF-8是明显的选择)。


是的,你说得对。问题只出现在打印上,当我把这些行传递给其他东西(例如 QListView)时,它们显示正常。 - Peter-W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接