处理重音词时出现 UnicodeDecodeError

UnicodeDecodeError while processing Accented words

我有一个 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)

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

版本:Python3.6,PyYAML 3.12

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

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

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

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

一般来说,您应该始终指定将字节流解码为文本的方式,否则,您的流可能不明确。

您可以指定使用 PyYAML 转储数据时应使用的编解码器,但无法在加载时指定 PyYAML 中的编码。但是 PyYAML 将处理 unicode 作为输入,并且您可以在打开文件进行阅读时明确指定要使用的编解码器,然后将该编解码器用于 return 文本(您将文件作为文本文件打开 '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 字符的转义序列)