替换字节数组中的字节以修复编码

时间:2019-02-11 10:26:08

标签: python python-3.x python-bytearray

我正在使用ftfy修复显示为UTF-8的破损CP1252编码,并将其转换为西里尔字母UTF-8,但是我发现有些字母可以不能解决。

我有一个字符串Ð'010СС199,我将其转换为字节并定义了对b"\xc3\x90'010\xc3\x90\xc2\xa1\xc3\x90\xc2\xa1199",其中:

\xc3\x90' -> \xd0\x92 -> Cyrillic В
\xc3\x90\xc2\xa1\ -> \xd0\xa1 -> cyrillic С

如您所见,Ð'的长度为2。ord在这种情况下不起作用。

要使用slice,我必须知道startend在哪里。

Translate在这里也不起作用。

以前我曾经使用过简单的字符串替换,但是现在我想改进我的方法并排除错误。

原始Ð'010СС199->转换-​​>输出В010СС199

编辑:

    str = "Ð'010СС199"
    str_to_bytes = str.encode("UTF-8")
    print(str_to_bytes)
    # UTF-8 bytes
    # \xc3\x90\xc2\xa0 : \xd0\xa0 -> cyrillic Р
    # \xc3\x90\xc2\xa1 : \xd0\xa1 -> cyrillic С
    # \xc3\x90\xe2\x80\x94' : \xd0\x97 -> cyrillic З
    # \xc3\x90' : \xd0\x92 -> Cyrillic В
    test_str = b"\xc3\x90'010\xc3\x90\xc2\xa1\xc3\x90\xc2\xa1199"
    t1 = test_str.replace(b'\xc3\x90\xc2\xa1', b'\xd0\xa1')
    print(t1)
    dict_cyr = {"Ð'": "P",
                "С":"C"}
    t2 = test_str.translate(test_str)
    print(t2)

我可以解释我如何收到结果。 1.我使用2cyr.com解码器。但即使在某些情况下它也失败了。 2.我有一个手动翻译的字符串,因此我将它们进行了比较,并借助可绘制的UTF-8来定义对应于西里尔字母的字节。

1 个答案:

答案 0 :(得分:2)

编码/解码中的一个常见问题是在utf-8中对字符串进行编码,然后将其解码为cp1252(通常是由于Windows应用程序愚蠢)。

这可能是这里发生的情况,因为西里尔大写字母VE('В''\u0412')和西里尔大写字母ES(or)分别翻译为:

>>> '\u0412'.encode().decode('cp1252')
'Ð’'
>>> '\u0421'.encode().decode('cp1252')
'С'

与原始字符串很近,除了我的转换使用右单引号(或U + 2019),而您的字符串包含撇号('或U + 0027)。

如果该字符串实际包含APOSTROPHE,则可能是由于尝试从cp1252编码的字符串中过滤非拉丁字符引起的。不利之处在于,很难猜测撇号是真正的单引号还是过滤后的右单引号。

如果确实包含单引号,则可以像下面这样简单地将其转换回去:

>>> 'В010СС199'.encode('cp1252').decode()
'В010СС199'