我需要测试字符串是否为Unicode,然后确定它是否为UTF-8。之后,获取该字符串的字节数长度,包括BOM(如果有)。这可以在 Python 中完成吗?
另外,出于教学目的,一个UTF-8字符串的字节列表表示是什么样子的?我很想知道Python中如何表示UTF-8字符串。
后续编辑:pprint做得非常好。
另外,出于教学目的,一个UTF-8字符串的字节列表表示是什么样子的?我很想知道Python中如何表示UTF-8字符串。
后续编辑:pprint做得非常好。
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)的序列。
string.decode
。 - ecatmurUnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
。 - Eduard Florinescustring
已经是一个unicode
对象,因此它是一个字符序列,而不是字节。您可以使用len(string.encode('utf-8'))
检查其UTF-8表示使用了多少字节。 - ecatmurzipfile
库的Zipinfo
对象有一个隐藏字段:orig_filename
,除了已经是Unicode的filename
之外,它还包含了文件名的原始编码,在我的情况下是UTF8。 - Eduard Florinescu如果您还没有阅读过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+中会有一些变化。
检查Unicode是否存在
>>>a = u'F'
>>>isinstance(a, unicode)
True
检查文本是否为UTF-8或ASCII编码
>>>import chardet
>>>encoding = chardet.detect('AA')
>>>encoding['encoding']
'ascii'
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
string.decode('ascii')
,但这没有太大意义,因为ASCII是UTF-8有效的。 - ecatmur