如何检测字符串字节编码?

Posted

技术标签:

【中文标题】如何检测字符串字节编码?【英文标题】:How to detect string byte encoding? 【发布时间】:2013-04-01 20:23:29 【问题描述】:

os.listdir() 读取了大约 1000 个文件名,其中一些以 UTF8 编码,一些是 CP1252。

我想将它们全部解码为 Unicode,以便在我的脚本中进行进一步处理。有没有办法让源编码正确解码成 Unicode?​​p>

例子:

for item in os.listdir(rootPath):

    #Convert to Unicode
    if isinstance(item, str):
        item = item.decode('cp1252')  # or item = item.decode('utf-8')
    print item

【问题讨论】:

【参考方案1】:

使用 chardet 库。超级简单

import chardet

the_encoding = chardet.detect('your string')['encoding']

就是这样!

在 python3 中你需要提供类型 bytes 或 bytearray 所以:

import chardet
the_encoding = chardet.detect(b'your string')['encoding']

【讨论】:

在我看来它不起作用。我创建了字符串变量并将其编码为 utf-8。 chardet 返回 TIS-620 编码。 我发现 cchardet 似乎是此库或类似库的当前名称...; chardet 找不到。 这里有点困惑。似乎不可能提供 str 类作为参数。只有 b'your string' 对我有用,或者直接提供一个字节变量。 这个答案对我来说的问题是,一些 cp1252/latin1 字符可以被解释为技术上有效的 utf8 - 这导致 ê 类型字符应该是 êchardet 似乎先尝试 utf8,结果是这样。可能有办法告诉它使用哪个顺序,但lucemia's answer 对我来说效果更好。 在 Python 3 中:TypeError: Expected object of type bytes or bytearray, got: <class 'str'>【参考方案2】:

如果您的文件在cp1252utf-8 中,那么有一个简单的方法。

import logging
def force_decode(string, codecs=['utf8', 'cp1252']):
    for i in codecs:
        try:
            return string.decode(i)
        except UnicodeDecodeError:
            pass

    logging.warn("cannot decode url %s" % ([string]))

for item in os.listdir(rootPath):
    #Convert to Unicode
    if isinstance(item, str):
        item = force_decode(item)
    print item

否则,有一个字符集检测库。

Python - detect charset and convert to utf-8

https://pypi.python.org/pypi/chardet

【讨论】:

【参考方案3】:

你也可以使用json包来检测编码。

import json

json.detect_encoding(b"Hello")

【讨论】:

以上是关于如何检测字符串字节编码?的主要内容,如果未能解决你的问题,请参考以下文章

在JavaScript中检测含中文的字符串在UTF-8编码下占用的字节数

如何检测和修复不正确的字符编码

Java检测文件是否UTF8编码

文件-读取与编码检测

如何在 PHP 中验证 utf 序列?

如何在 Ruby 中删除 4 字节 utf-8 字符?