解烤乱码问题

4
当您遇到解码错误的字符时,如何确定可能是原始字符串的候选项?
Ä×èÈÄÄî▒è¤ô_üiâAâjâüâpâXüj_10òb.png

我知道这个图片文件名本应该是一些日文字符。但是在尝试使用urllib进行引用/取消引用、对iso8859-1和utf8进行编码和解码的过程中,我无法还原并获得原始文件名。

这种损坏是否可以逆转?


我很佩服你能从那些乱码中看出它是日语。 - Burhan Khalid
这并不是来自于那些胡言乱语本身。我从接收到这些胡言乱语的上下文中知道了这一点。 - wim
1个回答

5
你可以使用 chardet(使用 pip 安装):
import chardet

your_str = "Ä×èÈÄÄî▒è¤ô_üiâAâjâüâpâXüj_10òb"
detected_encoding = chardet.detect(your_str)["encoding"]

try:
    correct_str = your_str.decode(detected_encoding)
except UnicodeDecodeError:
    print("Could not estimate encoding")

结果:时间测试视角(Anime Pass)_10秒(不确定是否正确)

对于Python 3(源文件编码为utf8):

import chardet
import codecs

falsely_decoded_str = "Ä×èÈÄÄî¦è¤ô_üiâAâjâüâpâXüj_10òb"

try:
    encoded_str = falsely_decoded_str.encode("cp850")
except UnicodeEncodeError:
    print("could not encode falsely decoded string")
    encoded_str = None

if encoded_str:
    detected_encoding = chardet.detect(encoded_str)["encoding"]

    try:
        correct_str = encoded_str.decode(detected_encoding)
    except UnicodeEncodeError:
        print("could not decode encoded_str as %s" % detected_encoding)

    with codecs.open("output.txt", "w", "utf-8-sig") as out:
        out.write(correct_str)

总之,以下是要点:
>>> s = 'Ä×èÈÄÄî▒è¤ô_üiâAâjâüâpâXüj_10òb.png'
>>> s.encode('cp850').decode('shift-jis')
'時間試験観点(アニメパス)_10秒.png'

2
测试时间视角(动画路径)_10秒。 - Matteo Italia
这看起来非常酷和有前途,但我得到的结果与你不同。你是按照这里显示的代码运行的吗?Python和chardet版本号是多少? - wim
我在Python 2.7.7 + chardet 2.2.1上运行了这个程序。在Python 3上,这肯定不起作用,我会看看如何解决。 - galinden
4
由于上述内容包含了非ASCII字符的字节串,其结果取决于您保存源代码文件所使用的编码方式。由于字符串 Ä×èÈÄÄî▒è¤ô_üiâAâjâüâpâXüj_10òb 是以代码页932编码(类似Shift-JIS)的字符串被错误地解释为代码页850(DOS西欧)而得到的,因此上述源代码需要以cp850格式保存才能正常工作。 - bobince
1
这是我基于以往经验的启发式方法;显然,它在自动检测方面并不实用。如果您尝试以编程方式解决问题,您可能会为“最像目标语言”的评分函数,并尝试使用Python依次知道的所有编码进行编码和重新解码。未混淆的文本可能并不总是可恢复的:有许多编码,其中不是每个字节都映射到一个字符,因此在真实编码中使用这些字节的字符将丢失。 - bobince
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接