代码之家  ›  专栏  ›  技术社区  ›  Aaron Altman

CP-1252/ANSI读数上的python 3扼流圈

  •  5
  • Aaron Altman  · 技术社区  · 16 年前

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

      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()还是使用codec模块中的某些内容以不同方式打开这些参数?

    这就产生了用python 2编写并用2to 3工具转换为3的代码。

    更新:原来这是向解析器提供zipfile的结果。单元测试实际上预期会发生这种情况。解析器应该将其识别为无法解析的内容。所以,我需要更改我的异常处理。在这个过程中。

    3 回复  |  直到 16 年前
        1
  •  13
  •   Marius Gedminas    16 年前

    位置0x81在Windows-1252(又名CP1252)中未分配。它被分配给拉丁语1(aka iso 8859-1)中的U+0081高八位字节预设(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
    

    现在要将此文件视为拉丁语-1,请通过 encoding 正如codeape所建议的那样:

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

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

        2
  •  3
  •   codeape    16 年前

    您可以放松错误处理。

    例如:

    f = open(filename, encoding="...", errors="replace")
    

    或:

    f = open(filename, encoding="...", errors="ignore")
    

    见 the docs .

    编辑:

    但您确定问题出在读取文件中吗?当有什么东西被写入控制台时会发生异常吗?检查 http://wiki.python.org/moin/PrintFails

        3
  •  2
  •   John Machin Santi    16 年前

    所有文件都是“非Unicode”。Unicode是必须编码的内部表示形式。您需要为每个文件确定使用了什么编码,并在打开文件时指定需要的编码。

    如追溯和错误信息所示 , 相关文件未编码在 cp1252 .

    如果它编码在 latin1 , the "\x81" 它抱怨的是一个c1控制字符甚至没有名称(Unicode)。 考虑 拉丁语1 非常不可能是有效的。

    你说“有些文件是用xml.dom.minidom解析的”——解析成功还是失败?

    有效的XML文件应该在第一行声明其编码(默认为UTF-8),并且不需要在代码中指定编码。向我们展示用于执行xml.dom.minidom解析的代码。

    “其他人直接读作iterables”——请输入示例代码。

    建议:尝试在浏览器中打开每种类型的文件。然后单击“查看”,然后单击“字符编码”(Firefox)或“编码”(Internet Explorer)。浏览器猜测了什么编码[通常是可靠的]?

    其他可能的编码线索:文件中的文本使用了哪些语言?你从哪里得到文件的?

    注意:请用澄清信息编辑您的问题,不要在评论中回答。