Python 3 在 CP-1252/ANSI 读取时阻塞

标签 python unicode latin1 cp1252 python-3.x

我正在研究一系列解析器,从中我从我的单元测试中得到一堆回溯,例如:

  File "c:\Python31\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 112: character maps to <undefined>

文件是用 open() 打开的,没有额外的参数。我可以将额外的参数传递给 open() 或使用编解码器模块中的某些东西以不同方式打开这些参数吗?

这产生了用 Python 2 编写并使用 2to3 工具转换为 3 的代码。

更新:事实证明这是将 zip 文件输入解析器的结果。单元测试实际上期望这种情况发生。解析器应该将其识别为无法解析的内容。所以,我需要改变我的异常处理。现在正在这样做。

最佳答案

位置 0x81 在 Windows-1252(又名 cp1252)中未分配。它被分配给 Latin-1(又名 ISO 8859-1)中的 U+0081 HIGH OCTET PRESET (HOP) 控制字符。我可以像这样在 Python 3.1 中重现您的错误:

>>> b'\x81'.decode('cp1252')
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 0: character maps to <undefined>

或使用实际文件:

>>> open('test.txt', 'wb').write(b'\x81\n')
2
>>> open('test.txt').read()
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte

现在要将此文件视为 Latin-1,您需要传递 encoding 参数,就像 codeape 建议的那样:

>>> open('test.txt', encoding='latin-1').read()
'\x81\n'

请注意 Windows-1257 和 Latin-1 编码之间存在差异,例如Latin-1 没有“引号”。如果您正在处理的文件是文本文件,请问问自己\x81 在其中做什么。

关于Python 3 在 CP-1252/ANSI 读取时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3284827/

相关文章:

python - Pygame - 运动加速

java - 打印编码的 unicode 字符

iphone - 确定字体是否可以在 Cocoa Touch 中呈现 Unicode 字符

php - 如何在MySQL中保存通过PHP输入的外语输入(目前正在更改)

mysql - 更改 MySQL 数据库的编码

php - 如何使用 php 检索 utf-8 数据并在 excelsheet 数据库转储中显示正确的编码?

Python 如何在 BeautifulSoup 中提取具有相同类名的数据

python - 如何比较 2 个不同的 csv 文件并在没有 CSV-diff 的情况下输出差异

python - 在Python中从URL中提取片段

javascript - 如何在 JavaScript 中从代理对构造 UTF-16 字符?