将 UTF-8 文本中的非 UTF-8 ASCII 文本转换为各自的字符

Convert non UTF-8 ASCII literals in otherwise UTF-8 text to their respective character

提问人:Markus 提问时间:2/13/2023 最后编辑:mkrieger1Markus 更新时间:2/13/2023 访问量:64

问:

我有一个 UTF8 编码的文本,该文本已被破坏并包含一些“cp1252”ASCII 文本。 我正在尝试隔离文字并逐个转换它们,但是以下代码不起作用,我不明白为什么......

text = "This text contains some ASCII literal codes like \x9a and \x9e."

# Find all ASCII literal codes in the text
codes = re.findall(r'\\x[0-9a-fA-F]{2}', text)

# Replace each ASCII literal code with its decoded character
for code in codes:
    char = bytes(code, 'ascii').decode('cp1252')
    text = text.replace(code, char)

print(text)
python-3.x utf-8 cp1252

评论

1赞 mkrieger1 2/13/2023
为什么你认为它不起作用?
0赞 chepner 2/13/2023
如果它有一个 4 个字符的转义序列而不是转义序列应该表示的字节,那真的是被破坏了。
0赞 chepner 2/13/2023
text不包含 4 个字符的序列 , , , ;它包含单个 Unicode 字符 U+009A。\x9a

答:

3赞 Mark Tolonen 2/13/2023 #1

无需正则表达式。编码将 1:1 从 Unicode 码位 U+0000 转换为 U+00FF 到字节。然后正确解码:latin1b'\x00'b'\xff'

>>> text = "This text contains some ASCII literal codes like \x9a and \x9e."
>>> text.encode('latin1').decode('cp1252')
'This text contains some ASCII literal codes like š and ž.'

该文本可能首先被解码为(拉丁语-1的另一个名称)。理想情况下,将要解码代码固定为 .ISO-8859-1cp1252