处理重音字时的UnicodeDecodeError

时间:2018-06-06 12:38:05

标签: python yaml python-3.6 pyyaml

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

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

仅限于嵌入式环境。

YAML样本:

data: ã

读取YAML的片段:

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

尝试了一堆解决方案但没有成功。

版本:Python 3.6,PyYAML 3.12

2 个答案:

答案 0 :(得分:1)

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

Unicode中重音字符的表示超出了此范围,因此您将获得解码错误。

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

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

通常,您应该始终指定如何将字节流解码为文本,否则您的流可能不明确。

答案 1 :(得分:1)

您可以指定在使用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字符的转义序列)< / p>