【问题标题】:UnicodeDecodeError while processing Accented words处理重音词时出现 UnicodeDecodeError
【发布时间】:2018-06-06 12:38:04
【问题描述】:

我有一个读取 YAML 文件的 python 脚本(在嵌入式系统上运行)。没有重音,脚本在我的开发机器和嵌入式系统上正常运行。但是带有重音的单词会使它崩溃

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 6: ordinal not in range(128)

仅在嵌入式环境中。

YAML 示例:

data: ã

读取 YAML 的 sn-p:

with open(YAML_FILE, 'r') as stream:
  try:
    data = yaml.load(stream)

尝试了很多解决方案都没有成功。

版本:Python 3.6、PyYAML 3.12

【问题讨论】:

  • 那个 sn-p 没有从文件中读取 YAML 文档,它有语法错误(没有 except),YAML_FILE 未定义且 yaml 未导入。总是发布完整的最小示例,在不知道和/或访问嵌入式系统的情况下重现这样的问题已经足够困难了。让回答者轻松,这是为了您自己的利益。而且你可能会得到这个错误,甚至没有尝试加载为 YAML,只需读取文件就足够了

标签: python yaml python-3.6 pyyaml


【解决方案1】:

正在读取您的字节的编解码器已设置为 ASCII。这将您的字节值限制在 0 到 127 之间。

Unicode 中重音字符的表示超出此范围,因此您会遇到解码错误。

UTF-8 编解码器可以解码 ASCII 和 UTF-8,因为 ASCII 是 UTF-8 的一个(非常小的)子集,按照设计。

如果您可以将编解码器更改为 UTF-8 解码,它应该可以工作。

通常,您应该始终指定如何将字节流解码为文本,否则,您的流可能会模棱两可。

【讨论】:

  • 无论您使用何种技术,UTF-8 无处不在的这一原则是一个很好的通用国际化建议。目前的 HTML5.3 草案正朝着仅支持 UTF-8 的方向发展
  • 好的。感谢你的回答。它适用于使用 utf-8 编码加载文件。但是之后,当我尝试访问字典中的键时,会抛出相同的错误。
  • 虽然这表明另一个 UTF-8 错误,但很难准确猜测发生了什么。我建议你把它变成另一个问题,有它自己的具体细节。
【解决方案2】:

您可以指定在使用 PyYAML 转储数据时应使用的编解码器,但在加载时无法在 PyYAML 中指定您的编码。但是 PyYAML 将处理 unicode 作为输入,您可以明确指定在打开文件进行读取时使用哪个编解码器,然后使用该编解码器返回文本(您使用 'r' 作为文本文件打开文件,这是默认的open())。

import yaml

YAML_FILE = 'input.yaml'

with open(YAML_FILE, encoding='utf-8') as stream:
    data = yaml.safe_load(stream)

请注意,您几乎不必使用yaml.load()已证明不安全,请改用yaml.safe_load()

要以您加载它的相同格式转储data,请使用:

import sys
yaml.safe_dump(data, sys.stdout, allow_unicode=True, encoding='utf-8',
               default_flow_style=False)

default_flow_style 是必需的,以免得到流式花括号,allow_unicode 是必需的,否则你会得到 data: "\xE3"(即 unicode 字符的转义序列)

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    相关资源
    最近更新 更多