检查编码并转换为Unicode

1 投票
3 回答
897 浏览
提问于 2025-04-17 15:45

我有一个包含不同字符串的列表。有时候这些字符串是用 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 在这个答案的评论中指出的,你应该修复最初导致数据损坏的代码。

撰写回答