当前位置: 首页 > 面试题库 >

Python-处理混合编码文件

阎功
2023-03-14
问题内容

我有一个主要为UTF-8的文件,但是也发现了一些Windows-1252字符。

我创建了一个表,以将Windows-1252(cp1252)字符映射到对应的Unicode对应表,并希望使用它来修复编码错误的字符,例如

cp1252_to_unicode = {
    "\x85": u'\u2026', # …
    "\x91": u'\u2018', # ‘
    "\x92": u'\u2019', # ’
    "\x93": u'\u201c', # “
    "\x94": u'\u201d', # ”
    "\x97": u'\u2014'  # —
}

for l in open('file.txt'):
    for c, u in cp1252_to_unicode.items():
        l = l.replace(c, u)

但是尝试以这种方式进行替换会导致引发UnicodeDecodeError,例如:

"\x85".replace("\x85", u'\u2026')
UnicodeDecodeError: 'ascii' codec can't decode byte 0x85 in position 0: ordinal not in range(128)

有关如何处理此问题的任何想法?


问题答案:

如您所知,如果您尝试将此字符串解码为utf-8,则会收到“ UnicodeDecode”错误,因为这些伪造的cp1252字符是无效的utf-8-

但是,Python编解码器允许您使用codecs.register_error函数注册用于处理编码/解码错误的回调-它获取UnicodeDecodeerror
aa参数-您可以编写这样的处理程序,以免将数据解码为“ cp1252”,并且继续在utf-8中对字符串的其余部分进行解码。

在我的utf-8终端中,我可以像这样构建一个混合的错误字符串:

>>> a = u"maçã ".encode("utf-8") + u"maçã ".encode("cp1252")
>>> print a
maçã ma�� 
>>> a.decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 9-11: invalid data

我在这里编写了上述回调函数,并发现了一个问题:即使将下一个字符串解码的位置增加1,这样,如果下一个字符也不是utf-8并从下一个字符开始,它将在下一个字符开始如果是range(128)的字符,则会在超出range(128)字符的第一个字符处引发错误-
这意味着,如果找到连续的非ascii,非utf-8字符,则解码将“返回”。

解决此问题的方法是在error_handler中具有状态变量,该状态变量将检测到此“向后移动”并从上次调用它恢复解码-
在这个简短的示例中,我将其实现为全局变量-(必须手动进行在每次调用解码器之前重置为“ -1”):

import codecs

last_position = -1

def mixed_decoder(unicode_error):
    global last_position
    string = unicode_error[1]
    position = unicode_error.start
    if position <= last_position:
        position = last_position + 1
    last_position = position
    new_char = string[position].decode("cp1252")
    #new_char = u"_"
    return new_char, position + 1

codecs.register_error("mixed", mixed_decoder)

在控制台上:

>>> a = u"maçã ".encode("utf-8") + u"maçã ".encode("cp1252")
>>> last_position = -1
>>> print a.decode("utf-8", "mixed")
maçã maçã


 类似资料:
  • 本文向大家介绍批处理与python代码混合编程的方法,包括了批处理与python代码混合编程的方法的使用技巧和注意事项,需要的朋友参考一下 批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值,比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写,bathome出品的命令工具包管理器bcn 使用了bat+jscript的混编实现的。 cn-dos和b

  • 问题内容: 我正在尝试使用Xuggler(我 相信 它是在幕后使用的)执行以下操作: 接受原始的MPJPEG视频比特流(来自小型TTL串行相机)并将其编码/转码为h.264;和 接受原始音频bitream(来自麦克风)并将其编码为AAC;然后 将两个(音频和视频)位流一起混合到MPEG-TS容器中 我已经看过/阅读了他们的一些出色的教程,到目前为止,这是我所拥有的: 首先,我想我已经很近了,但是还

  • 问题内容: 在Python中,元素的编码方式是什么?他们用编码编码吗? sys.getdefaultencoding():返回Unicode实现使用的当前默认字符串编码的名称。 PS :正如一些答案中所指出的,确实是一个更好的 猜测 。但是,我希望看到这个问题的明确答案,并提供可靠来源的指导! PPS :正如Wim指出的那样,Python 3通过将对象放在sys.argv中来解决此问题(如果我理解

  • 本文向大家介绍python urllib中的编码处理示例,包括了python urllib中的编码处理示例的使用技巧和注意事项,需要的朋友参考一下 那我们想转回去呢? 不同的编码格式对urllib的结果页是有影响的,百度的是gbk,其他的一般网站比如google就是utf8的。所以可以用下列语句实现。 这里的 sys.stdin.encoding 是读取当前环境的编码,这样写的话可移植性高,win

  • 本文向大家介绍Python 2/3下处理cjk编码的zip文件的方法,包括了Python 2/3下处理cjk编码的zip文件的方法的使用技巧和注意事项,需要的朋友参考一下 今天项目中遇到了中文编码的zip文件,处理了蛮长时间,所以记录下,以免下次踩坑。 Python2下 Python2中读取zip文件,zipfile.ZipInfo的filename类型是str,基本上类似于python3中的by

  • 问题内容: 我一直在用Python开发一个库,我想做一些性能改进。 是否可以在Python中编写一些代码并在Go中编写一些代码,并在它们之间传递数据?如果可能的话,是否有任何有关此操作的示例? 像这样: 问题答案: 你需要一个 胶 之间,例如编程语言或通信通过网络。如果您将https://docs.python.org/2/extending/extending.html与http://golan