use*_*059 4 python encoding utf-8
我搜索并发现了许多类似的问题和文章,但没有一个能让我解决这个问题.
我使用Python 3.5.0(V3.5.0:374f501f4567,2015年9月13日,2点27分37秒)[MSC v.1900 64位(AMD64)]在Windows 10.
我有一个简单的文本文件,它以UTF-8编码为Windows,如下所示:

我想要做的就是将此文件的内容读入Python字符串并在标准控制台中正确显示.
这是第一次失败的尝试:
file_name=r'c:\temp\encoding_test.txt'
fh=open(file_name,'r')
f_str=fh.read()
fh.close()
print(f_str)
Run Code Online (Sandbox Code Playgroud)
print语句引发了一个异常:
'charmap'编解码器无法对位置100中的字符'\ u201e'进行编码:字符映射到未定义
使用调试器,f_str包含以下内容:
'我希望在将此文件读入Python后正确显示以下字符:\n \nÃ"Ã-ÜäÃüÃÃÃ?\n"
这对我来说已经非常令人费解了.Python 3不是在任何地方都使用UTF-8作为默认值吗?什么其他编码可以工作?我尝试了所有的Notepad ++支持,没有用.
好吧,有点复杂,我试过:
import codecs
file_name=r'c:\temp\encoding_test.txt'
my_encoding='utf-8'
fh=codecs.open(file_name,'r',encoding=my_encoding)
f_str=fh.read().encode(my_encoding)
fh.close()
print(f_str)
Run Code Online (Sandbox Code Playgroud)
这至少不会引发异常,而是收益率
b'我希望在将此文件读入Python后正确显示以下字符:\ r \n\r \n\xc3\x84\xc3\x96\xc3\x9c\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f\r \n'我
这对我来说完全是一团糟.这里有人可以帮我解决这个问题吗?
接受的答案太复杂了.您只需要为open指定编码:
fh = open(file_name, encoding='utf8')
Run Code Online (Sandbox Code Playgroud)
一切都没有问题.
你的另一个问题的答案:
Python 3不是在任何地方都使用UTF-8作为默认值吗?
"不是在与外部世界通信时(在这种情况下是文件系统),因为它与您的操作系统不一致".规范说用户的首选编码取决于语言环境.做
>>> import locale
>>> locale.getpreferredencoding()
Run Code Online (Sandbox Code Playgroud)
查看系统中的内容 - 很可能是 Windows上的"cp something ",具体取决于确切的默认代码页集.但是你总是可以使用显式encoding参数覆盖open.
在那里,我希望你学到了新东西.:-)
您在使用后编码为字节codecs.open,只需打印数据就应该给您想要的,正如我们解码回来时所看到的:
In [31]: s = b\'I would like the following characters to display correctly after reading this file into Python:\\r\\n\\r\\n\\xc3\\x84\\xc3\\x96\\xc3\\x9c\\xc3\\xa4\\xc3\\xb6\\xc3\\xbc\\xc3\\x9f\\r\\n\'\n\nIn [32]: print(s)\nb\'I would like the following characters to display correctly after reading this file into Python:\\r\\n\\r\\n\\xc3\\x84\\xc3\\x96\\xc3\\x9c\\xc3\\xa4\\xc3\\xb6\\xc3\\xbc\\xc3\\x9f\\r\\n\'\n\nIn [33]: print(s.decode("utf-8"))\nI would like the following characters to display correctly after reading this file into Python:\n\n\xc3\x84\xc3\x96\xc3\x9c\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f\nRun Code Online (Sandbox Code Playgroud)\n\n如果您没有看到正确的输出,那么问题出在您的 shell 编码上。Windows 控制台编码不是 utf-8,因此运行代码的位置和 shell 编码很重要。
\n