替换字节数组中的字节以修复编码
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
,我必须知道 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 图表的帮助下定义了哪些字节对应于西里尔字母。
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'
我正在使用 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 图表的帮助下定义了哪些字节对应于西里尔字母。
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'