【问题标题】:Python 3 UTF-8 encoding doesnt really workPython 3 UTF-8 编码并没有真正起作用
【发布时间】:2014-10-06 11:59:46
【问题描述】:

我现在已经阅读了很多关于 Python 3 中 UTF-8 编码的主题,但它仍然不起作用,而且我找不到我的错误。

我的代码是这样的

def main():

    with open("test.txt", "rU", encoding='utf-8') as test_file:
        text = test_file.read()
    print(str(len(text)))


if __name__ == "__main__":

    main()

我的test.txt 文件如下所示

ö

我收到以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 0: invalid start byte

【问题讨论】:

  • 您的文件不是 UTF-8 编码的。
  • 它是一个测试文件。我应该用 Python3 编写一个能够读取它的程序。并再次写出来。它应该是 UTF-8。
  • 这里有两个问题 - 您的文件不是 UTF-8,如果不是,则其中包含 ä 以外的其他内容。
  • 我从大学的服务器上得到了测试文件。所以我想文件应该没问题。有趣的是,我可以使用 open(test.txt).read() 读取文件,并且它可以正常工作......我不明白。
  • @GVVMultigamingClan: open() without encoding 将您的 系统默认值 作为编码。如果open('test.txt').read() 有效,则文件不是 UTF-8,而是locale.getpreferredencoding() 返回的任何内容。

标签: python encoding utf-8


【解决方案1】:

您的文件不是 UTF-8 编码的。我也不确定ä 使用 F6 的编码是什么;该代码点是拉丁语 1 和 CP-1252 中 ö 的编码:

>>> b'\xf6'.decode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 0: invalid start byte
>>> b'\xf6'.decode('latin1')
'ö'

您需要使用用于创建该文件的任何工具将该文件保存为 UTF-8。

如果open('text').read() 有效,那么您可以使用默认系统编码解码文件。见open() function documentation

encoding 是用于对文件进行解码或编码的编码名称。这应该只在文本模式下使用。默认编码取决于平台(无论locale.getpreferredencoding() 返回什么),但可以使用 Python 支持的任何编码。

这并不是说您正在使用正确的编码读取文件;这只是意味着默认编码没有中断(遇到没有字符映射的字节)。它仍然可能将这些字节映射到错误的字符。

敦促您阅读 Unicode 和 Python:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多