Python 3:读取包含德语变音符号的UTF-8文件

时间:2016-03-26 23:44:42

标签: python encoding utf-8

我搜索并发现了许多类似的问题和文章,但没有一个能让我解决这个问题。

我在Windows 10上使用Python 3.5.0(v3.5.0:374f501f4567,2015年9月13日,02:27:37)[MSC v.1900 64 bit(AMD64)]。

我有一个简单的文本文件,它以UTF-8编码为Windows,如下所示: enter image description here

我想要做的就是将此文件的内容读入Python字符串并在标准控制台中正确显示。

这是第一次失败的尝试:

    file_name=r'c:\temp\encoding_test.txt'
    fh=open(file_name,'r')
    f_str=fh.read()
    fh.close()
    print(f_str)

print-statement引发了一个异常:

  

'charmap'编解码器无法对位置100中的字符'\ u201e'进行编码:字符映射到未定义

使用调试器,f_str包含以下内容:

  

'我希望在将此文件读入Python后正确显示以下字符:\ 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)

这至少不会引发异常,而是产生

  

b'我希望在将此文件读入Python后正确显示以下字符:\ r \ n \ r \ n \ xc3 \ x84 \ xc3 \ x96 \ xc3 \ x9c \ xc3 \ xa4 \ xc3 \ xb6 \ XC3 \命苦\ XC3 \ x9f \ r \ n”   我

这对我来说完全是一团糟。这里有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:7)

接受的答案太复杂了。您只需要为open指定编码:

fh = open(file_name, encoding='utf8')

一切都没有问题。

你的另一个问题的答案:

  

Python 3不能在任何地方使用UTF-8作为默认值吗?

“当与外部世界(在这种情况下是文件系统)通信时,是不是因为它与您的操作系统不一致”。规范说用户的首选编码取决于语言环境。做

>>> import locale
>>> locale.getpreferredencoding()

查看系统中的内容 - 很可能是Windows上的“cp something ”,具体取决于确切的默认代码页集。但您始终可以使用encoding的显式open参数覆盖。

在那里,我希望你能学到新东西。 : - )

答案 1 :(得分:1)

使用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'

In [32]: print(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'

In [33]: print(s.decode("utf-8"))
I would like the following characters to display correctly after reading this file into Python:

ÄÖÜäöüß

如果你没有看到正确的输出,那么你的shell编码是问题所在。 Windows控制台编码不是utf-8,因此您运行代码并且shell编码很重要。