Python中同一Unicode字符的长度不同

3
我发现有关unicode的一些奇怪之处,我理解如果我使用u"" + "string",类型应该是unicode,但是它们的长度为什么不同呢?
print len(u''+'New York\u200b')
14
print type(u''+'New York\u200b')
<type 'unicode'>
print len(u'New York\u200b')
9
print type(u'New York\u200b')
<type 'unicode'>

我尝试去除\u200b,我认为它是Unicode编码。
text = u'New York\u200b'
print text.encode('ascii', errors='ignore')
New York
text = u''+'New York\u200b'
print text.encode('ascii', errors='ignore')
New York\u200b

我得到了不同的结果,真的很困惑!顺便说一下,我正在使用Python 2.7,是时候改为3.3了吗?提前感谢!


u''+'New York\u200b' 中,'New York\u200b' 不是Unicode格式,因此 \u200b 被忽略了。但是,这与您的第二个结果不一致。 - njzk2
2个回答

4
>>> (u''+'New York\u200b').encode('utf-8')
'New York\\u200b'

正如您所看到的,由于'New York\u200b'不是unicode字符串,因此\u转义并没有任何特殊含义,而是按字面意义解释,即作为ASCII字符序列\ u 2 0 0 b,因此该字符串长度为14。使用u''只是将字符串转换为unicode,但它并不会重新解释内容。在字面值之前加上u使Python将其解释为转义符,因此作为单个字符解释,因此该字符串长度为9。
在第二个例子中:
text = u''+'New York\u200b'
print text.encode('ascii', errors='ignore')
New York\u200b
这里的.encode并没有修改字符串中的字符,它只是从unicode转换为str
如果你print这两个字符串的内容,可能会更清晰。
>>> print(u'New York\u200b')  # note: \u200b interpreted as unicode character
New York
>>> print(b'New York\u200b'.decode('ascii'))
New York\u200b

或者,如果您希望看到实际的Unicode表示,请尝试使用代码点9731:

>>> print(u'New York\u2603')
New York☃
>>> print(b'New York\u2603'.decode('ascii'))
New York\u2603

非常感谢!所以您只会将引号中的内容从str转换为unicode,而不是它附加到的str,并使整个内容的类型为unicode? - amstree
@amstree 是的。当你连接两个字符串时,Python 不会 解释转义字符。 转义字符仅在创建字符串字面值时解释。连接操作将所有字符视为相同。 如果您想解释字符串的内容,应使用unicode-escape编码。 例如:b'\u2603'.decode('unicode-escape')u'\u2603'(或'☃'),而b'\u2603'.decode('ascii')是字符串u'\\u2603'。 后者是一个单字符字符串,前者是由字符\``u``2``6``0``3组成的6个字符字符串。 - Bakuriu

0

'New York\u200b' 是一个长度为14的非Unicode字符串。
(您可以将其附加到u''字符串中,但它本身还不是Unicode。)
u'New York\u200b' 是一个长度为9的Unicode字符串。


1
这是问题的重述,而不是答案。 - Marcin

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