【问题标题】:How to open an ascii-encoded file as UTF8?如何以 UTF8 格式打开 ascii 编码的文件?
【发布时间】:2012-09-04 11:26:06
【问题描述】:

我的文件是 US-ASCII 格式,像 a = file( 'main.html')a.read() 这样的命令会将它们加载为 ASCII 文本。如何让它加载为 UTF8?

我要解决的问题是:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 38: ordinal not in range(128)

我使用template_str.format(attrib=val) 中的文件内容进行模板化。但是要插入的字符串是 ASCII 的超集。

我们团队的版本控制和文本编辑器并不关心编码。那么如何在代码中处理呢?

【问题讨论】:

  • ASCII 是 UTF-8 的子集。但我怀疑您的问题比您在此处发布或理解的更多。
  • 拜托,拜托,去阅读这个优秀的article on Unicode和pythonUnicode HOWTO,然后改写你的问题(如果你还有的话)。
  • @MartijnPieters 我现在包含了我原来的问题\
  • 你的文件是 not ASCII,Python 只是试图解释它。你读过我链接的文章了吗?他们真的,真的,真的是必需的知识。

标签: python file-io utf-8 io ascii


【解决方案1】:

我想你确定你的文件是用 ASCII 编码的。你是? :) 由于 UTF-8 中包含 ASCII,因此您可以使用 UTF-8 解码此数据而不会出现问题。但是,当您确定数据只是 ASCII 时,您应该只使用 ASCII 而不是 UTF-8 对数据进行解码。

“如何让它以 UTF8 格式加载?”

我相信您的意思是“我如何让它以 unicode 格式加载?”。只需使用 ASCII 编解码器解码数据,在 Python 2.x 中,生成的数据将是 unicode 类型。在 Python 3 中,结果数据的类型为 str

您必须阅读此主题才能了解如何在 Python 中执行这种解码。理解之后就很简单了。

【讨论】:

  • 是的,file -bi 返回charset=us-ascii 进行编码。
  • 现在您添加了更多信息,您会看到您的文件实际上不是 ASCII 编码的。
【解决方案2】:

在 Python2 中工作的解决方案:

import codecs
fo = codecs.open('filename.txt', 'r', 'ascii')
content = fo.read()  ## returns unicode
assert type(content) == unicode
fo.close()

utf8_content = content.encode('utf-8')
assert type(utf8_content) == str

【讨论】:

    【解决方案3】:

    你试图在没有指定编码的情况下打开文件,这意味着 python 使用默认值(ASCII)。

    您需要使用.decode() 函数显式解码字节串:

     template_str = template_str.decode('utf8')
    

    您尝试插入模板的 val 变量本身就是一个 unicode 值,python 也希望自动将您的字节字符串模板(从文件中读取)转换为 unicode 值,以便它可以将两者结合起来,它会使用默认编码来执行此操作。

    我是否已经提到您应该阅读 Joel Spolsky 的 article on UnicodePython Unicode HOWTO?他们会帮助您了解这里发生的事情。

    【讨论】:

    • 原来一个常见的®(在它正确运行后才知道)可以使代码崩溃。我试图把它当作一个 bug 对待,因为这里是 20:00,我很生气。我会阅读这些内容并将其推荐给整个团队。我欠你的!
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2017-12-11
    • 2014-02-16
    • 1970-01-01
    相关资源
    最近更新 更多