检查编码并转换为Unicode
我有一个包含不同字符串的列表。有时候这些字符串是用 cp1251
编码的,有时候是 ASCII
,或者其他编码。我需要处理这些字符串(转换成 Unicode),因为我遇到了一个错误(UnicodeDecodeError),特别是在我尝试把这些数据保存为 JSON 格式的时候。
我该怎么做呢?
3 个回答
0
试着使用unicode函数把字符串转换成内置的unicode类型。
>>> s = "Some string"
>>> s = unicode(s)
>>> type(s)
<type 'unicode'>
针对你的问题,可以尝试这样来创建一个新的unicode字符串列表。
new = []
for item in myList:
new.append(unicode(item))
或者使用列表推导式。
new = [unicode(item) for item in myList]
可以看看官方的Python Unicode使用指南。
0
如果你知道编码是什么,那就很简单了:
unicode_string = encoded_string.decode(encoding)
但如果你不知道编码是什么,可能就会很难去识别它,这要看你期待的编码和语言是什么。
4
你可以使用 chardet 来检测一个字符串的编码方式,所以将这些字符串转换成 Unicode(在 Python 2.x 中)的一种方法是:
import chardet
def unicodify(seq, min_confidence=0.5):
result = []
for text in seq:
guess = chardet.detect(text)
if guess["confidence"] < min_confidence:
# chardet isn't confident enough in its guess, so:
raise UnicodeDecodeError
decoded = text.decode(guess["encoding"])
result.append(decoded)
return result
... 你可以这样使用:
>>> unicodify(["¿qué?", "什么?", "what?"])
[u'\xbfqu\xe9?', u'\u4ec0\u4e48\uff1f', u'what?']
注意: 像 chardet 这样的解决方案应该只在最后的情况下使用(比如,当你需要修复一个因为过去错误而损坏的数据集时)。它太脆弱,不适合在生产代码中依赖;相反,正如 @bames53 在这个答案的评论中指出的,你应该修复最初导致数据损坏的代码。