Python str与unicodetypes

使用Python 2.7,我想知道哪种真正的优势使用typesunicode而不是str ,因为他们似乎都能够保存Unicodestring。 有没有什么特别的原因可以使用scape char \ ?在unicodestring中设置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' 

所以, unicodestring似乎是使用latin1而不是utf-8编码的,原始string是使用utf-8编码的? 我现在更糊涂了! :S

unicode ,这是python 3的str ,是为了处理文本 。 文本是一个可能比单个字节更大代码点序列。 文本可以用特定的编码进行编码,将文本表示为原始字节(例如utf-8latin-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获取不同的值