Python str与unicodetypes
使用Python 2.7,我想知道哪种真正的优势使用typesunicode
而不是str
,因为他们似乎都能够保存Unicodestring。 有没有什么特别的原因可以使用scape char \
?在unicode
string中设置Unicode代码:
执行一个模块:
# -*- coding: utf-8 -*- a = 'á' ua = u'á' print a, ua
结果在:á,á
编辑:
使用Python shell进行更多的testing:
>>> a = 'á' >>> a '\xc3\xa1' >>> ua = u'á' >>> ua u'\xe1' >>> ua.encode('utf8') '\xc3\xa1' >>> ua.encode('latin1') '\xe1' >>> ua u'\xe1'
所以, unicode
string似乎是使用latin1
而不是utf-8
编码的,原始string是使用utf-8
编码的? 我现在更糊涂了! :S
unicode
,这是python 3的str
,是为了处理文本 。 文本是一个可能比单个字节更大的代码点序列。 文本可以用特定的编码进行编码,将文本表示为原始字节(例如utf-8
, latin-1
…)。 请注意, unicode
不编码 ! python使用的内部表示是一个实现细节,只要它能够表示你想要的代码点,你就不必关心它。
相反, str
是一个简单的字节序列。 它不代表文字! 实际上,在python中, str
被称为bytes
。
你可以把unicode
看作一些文本的一般表示,它可以用许多不同的方式编码成一个由str
表示的二进制数据序列。
你可以看到一些差异:
>>> len(u'à') # a single code point 1 >>> len('à') # by default utf-8 -> takes two bytes 2 >>> len(u'à'.encode('utf-8')) 2 >>> len(u'à'.encode('latin1')) # in latin1 it takes one byte 1 >>> print u'à'.encode('utf-8') # terminal encoding is utf-8 à >>> print u'à'.encode('latin1') # it cannot understand the latin1 byte
请注意,使用str
对特定编码表示的单个字节具有较低级别的控制,而在使用unicode
,只能在代码点级别进行控制。 例如,你可以做:
>>> 'àèìòù' '\xc3\xa0\xc3\xa8\xc3\xac\xc3\xb2\xc3\xb9' >>> print 'àèìòù'.replace('\xa8', '') à ìòù
什么之前是有效的UTF-8,现在不是了。 使用一个unicodestring,你不能以这样的方式运行得到的string不是有效的unicode文本。 你可以删除一个代码点,用不同的代码点replace一个代码点等,但你不能混淆内部表示。
您的terminal恰好被configuration为UTF-8。
印刷作品是一个巧合, 您正在向terminal写入原始的UTF-8字节。 a
是长度为2的值,包含两个字节,hex值C3和A1,而ua
是一个长度为1的unicode值,包含一个代码点U + 00E1。
这个长度的差异是使用Unicode值的一个主要原因; 你不能轻易地测量一个字节string中的文本字符的数量; 一个字节string的len()
告诉你使用了多less个字节,而不是多less个字符被编码。
当您将unicode值编码为不同的输出编码时,您可以看到不同之处:
>>> a = 'á' >>> ua = u'á' >>> ua.encode('utf8') '\xc3\xa1' >>> ua.encode('latin1') '\xe1' >>> a '\xc3\xa1'
请注意,Unicode标准的前256个编码点与拉丁1标准匹配,所以U + 00E1编码点被编码为拉丁文1作为一个hex值为E1的字节。
此外,Python在unicode和bytestring的表示中使用转义码,并且不可打印ASCII的低代码点也使用\x..
escape值表示。 这就是为什么一个代码点在128到255之间的Unicodestring看起来就像拉丁1编码。 如果你有一个unicodestring,其代码点超出U + 00FF,则使用不同的转义序列\u....
,而不是使用四位hex值。
看起来你还没有完全理解Unicode和编码之间的区别。 继续之前,请阅读以下文章:
-
绝对最小每个软件开发人员肯定,积极必须知道Unicode和字符集(没有借口!)通过Joel Spolsky
-
Python Unicode HOWTO
-
Ned Batchelder的语用Unicode
当你定义一个unicode时,字符a和á是相等的。 否则,算作两个字符。 试试len(a)和len(au)。 除此之外,您在使用其他环境时可能需要编码。 例如,如果您使用md5,则会为a和ua获取不同的值