Python str与unicode类型
使用Python
2.7,我想知道使用typeunicode
代替真正的优势是什么str
,因为它们似乎都可以容纳Unicode字符串。除了能够unicode
使用转义字符在字符串中设置Unicode代码之外,还有什么特殊的原因\
吗?:
使用以下命令执行模块:
# -*- coding: utf-8 -*-
a = 'á'
ua = u'á'
print a, ua
结果:á,á
编辑:
使用Python Shell进行更多测试:
>>> a = 'á'
>>> a
'\xc3\xa1'
>>> ua = u'á'
>>> ua
u'\xe1'
>>> ua.encode('utf8')
'\xc3\xa1'
>>> ua.encode('latin1')
'\xe1'
>>> ua
u'\xe1'
因此,该unicode
字符串似乎是使用latin1
而不是编码的utf-8
,而原始字符串是使用utf-8
?编码的 我现在更困惑了!:S
-
unicode
用于处理 文本 。文本是一个 代码点 序列, 可能大于一个字节 。文本可以被 编码
在一个特定的编码来表示文本作为原始字节(例如utf-8
,latin-1
…)。注意,这
unicode
是没有编码的 !python使用的内部表示形式是实现细节,只要它能够表示所需的代码点,您就不必在意它。相反,
str
在Python 2中是 字节 的简单序列。它不代表文字!您可以将其
unicode
视为某些文本的一般表示形式,可以用多种不同方式将其编码为通过表示的二进制数据序列str
。注意:在Python 3中,
unicode
已重命名为,str
并且bytes
为普通字节序列提供了一种新类型。您可以看到一些差异:
>>> 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,现在已经不复存在了。使用unicode字符串,您不能以结果字符串不是有效的unicode文本的方式进行操作。您可以删除代码点,将代码点替换为其他代码点等,但不能与内部表示混淆。