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

Replacing byte in bytes array to fix encoding

我正在使用 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 图表的帮助下定义了哪些字节对应于西里尔字母。

encoding/decoding 中的一个常见问题是以 utf-8 编码字符串,然后将字节串解码为 cp1252(通常是因为愚蠢的 windows 应用程序)。

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

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

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

如果字符串实际上包含撇号,则可能是由于尝试从 cp1252 编码字符串中过滤非拉丁字符所致。缺点是很难猜测撇号是真撇号还是过滤后的右单引号。

如果它确实包含单引号,那么它可以像这样简单地转换回来:

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