如何处理编码不明确的字符串

How to deal with strings where encoding is unclear

我知道网上和 Whosebug 上有很多关于 Python 和字符编码的内容,但我还没有真正找到我要找的答案。所以冒着重复的风险,我还是要问一下。

这是一个获取字典的脚本,其中所有键都正确地作为 unicode。这些值是编码未知的字符串。对于键来说没那么重要,键都非常简单,与值不同。这些值可以(并且确实)包含多种编码。有一些字典,其中一些值是 ASCII 其他值是 UTF-16BE,还有一些是 cp1250。

这完全打乱了进一步的处理,目前主要包括打印或连接(是的,就是这么简单)。

我提出的使 Python 打印语句正常工作的解决方法是:

for key in data.keys():
   # hope they did not chose a funky encoding
   try:
       print key+":"+data[key] # this triggers a UnicodeDecodeError on many encodings
       current_data = data[key]
   except UnicodeDecodeError:
   # trying to cope with a funky encoding             
        current_data = data[key].decode(chardet.detect(data[key])['encoding']) # doing this on each value, because the dictionary sometimes contains multiple encodings
        print key+":", # printing without newline was a workaround, because connecting didn't work
        print current_data.encode('UTF-8')

在 Python 中,这很好用。在我在项目中使用的 Jython 2.7rc1 中(不是切换选项),它打印的字符绝对不是原始编码(看起来很时髦的字符)。如果有人知道我如何使它在 Jython 中也能正常工作,那就太好了!

编辑(示例): 样本值:

Our latest scenarios explore two possible versions of the future seen through fresh “lenses”. 

创建一个字符串,其中左右双引号变为 \x8D 和 \x8E。我不知道那是什么编码。在 Python 使用上面的代码后,它会删除它们。在 Jython 中,它将它们变成白色方块。

我不熟悉 Jython,但我发现以下 link 可能有用:http://python.6.x6.nabble.com/character-encoding-issues-td1766833.html

它说你应该将所有 unicode 字符串保存在单独的文件中到你的源,并用 codecs.open 阅读它们。这似乎适用于遇到与您类似问题的人。

下面link也提到了一些关于给JVM指定编码参数的事情:https://answers.launchpad.net/sikuli/+question/156443

在没有看到任何实际错误输出的情况下,这就是我可以提供的帮助范围。