我正在使用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
,我必须知道start
和end
在哪里。
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来定义对应于西里尔字母的字节。
答案 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'