测试一个字符串是否为Unicode,它遵循哪个UTF标准,并获取其字节长度?

25
我需要测试字符串是否为Unicode,然后确定它是否为UTF-8。之后,获取该字符串的字节数长度,包括BOM(如果有)。这可以在 Python 中完成吗?
另外,出于教学目的,一个UTF-8字符串的字节列表表示是什么样子的?我很想知道Python中如何表示UTF-8字符串。
后续编辑:pprint做得非常好。

你期望字符串使用哪种编码? - ecatmur
如果字符串是ASCII,则它也是UTF-8。你在这里实际上想做什么? - ecatmur
在这种情况下,您只需要测试它是否为UTF-8。 - ecatmur
@ecatmur,如果它只有ASCII字符?我怎么知道呢? - Eduard Florinescu
您可以编写 string.decode('ascii'),但这没有太大意义,因为ASCII是UTF-8有效的。 - ecatmur
显示剩余2条评论
3个回答

34
try:
    string.decode('utf-8')
    print "string is UTF-8, length %d bytes" % len(string)
except UnicodeError:
    print "string is not UTF-8"

在Python 2中,str是一系列字节(byte)的序列,而unicode是一系列字符(character)的序列。您可以使用str.decode将字节序列解码为unicode,并使用unicode.encode将字符序列编码为str。例如,u"é"是包含单个字符U+00E9的Unicode字符串,也可以写成u"\xe9";将其编码为UTF-8将得到字节序列"\xc3\xa9"

在Python 3中,这种情况发生了变化;bytes是一系列字节(byte)的序列,而str是一系列字符(character)的序列。


我想要看一下字符串是ASCII还是Unicode,你的代码没有考虑到字符串可能是其他类型的UTF Unicode吗? - Eduard Florinescu
1
对于其他编码方式,请将另一种编码方式传递给 string.decode - ecatmur
我在 string.decode('utf-8') 上遇到了这个错误 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128) - Eduard Florinescu
在这种情况下,string已经是一个unicode对象,因此它是一个字符序列,而不是字节。您可以使用len(string.encode('utf-8'))检查其UTF-8表示使用了多少字节。 - ecatmur
似乎zipfile库的Zipinfo对象有一个隐藏字段:orig_filename,除了已经是Unicode的filename之外,它还包含了文件名的原始编码,在我的情况下是UTF8。 - Eduard Florinescu

7
我会为您翻译相关编程内容。以下是需要翻译的文本:

如果您还没有阅读过Joel Spolsky的The Absolute Minimum Every Software Developer Absolutely, Positively Must Know about Unicode and Character Sets (No Excuses!), 我一定会推荐它。

关于Python的Unicode和编码/解码机制,请从这里开始。要获取以utf-8编码的Unicode字符串的字节长度,您可以执行以下操作:

print len(my_unicode_string.encode('utf-8'))

您的问题标记为python-2.5,但请注意在Python 3+中会有一些变化。


7

检查Unicode是否存在

>>>a = u'F'
>>>isinstance(a, unicode)
True

检查文本是否为UTF-8或ASCII编码

>>>import chardet
>>>encoding = chardet.detect('AA')
>>>encoding['encoding']
'ascii'

1
使用实例时,我经常会遇到这种情况:UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal。如果我在第二个if语句中用('AA')代替,我会得到IndexError: tuple index out of range的错误提示。 - Eduard Florinescu

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