相同unicode的python长度不同

相同unicode的python长度不同,python,python-2.7,python-3.x,unicode,Python,Python 2.7,Python 3.x,Unicode,我发现unicode有些奇怪,在我的理解中,如果我使用u+字符串,类型将是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'> 也得到了不同的结果,我真的很困

我发现unicode有些奇怪,在我的理解中,如果我使用u+字符串,类型将是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'>
也得到了不同的结果,我真的很困惑!
顺便说一句,我正在使用Python2.7,是时候改成3.3了吗??提前谢谢

“纽约\u200b”是长度为14的非unicode字符串。 您将其附加到u字符串,但它本身还不是unicode。
u'New York\u200b'是长度为9的unicode字符串。

'New York\u200b'是长度为14的非unicode字符串。 您将其附加到u字符串,但它本身还不是unicode。 u'New York\u200b'是长度为9的unicode字符串

如您所见,由于“New York\u200b”不是unicode字符串,因此转义没有任何特殊意义,它被逐字解释,即作为ASCII字符序列\u 2 0 b,因此字符串的长度为14。u仅将字符串转换为unicode,但不会导致内容的重新解释。将u放在文本之前,使得python将其解释为转义,因此是单个字符,因此字符串长度为9

在第二个示例中:

此处.encode不修改字符串中的字符,它只将unicode转换为str

如果打印两个字符串的内容,可能会更清晰

>>> 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
如您所见,由于“New York\u200b”不是unicode字符串,因此转义没有任何特殊意义,它被逐字解释,即作为ASCII字符序列\u 2 0 b,因此字符串的长度为14。u仅将字符串转换为unicode,但不会导致内容的重新解释。将u放在文本之前,使得python将其解释为转义,因此是单个字符,因此字符串长度为9

在第二个示例中:

此处.encode不修改字符串中的字符,它只将unicode转换为str

如果打印两个字符串的内容,可能会更清晰

>>> 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

在u+'New York\u200b'中,'New York\u200b'不是unicode,因此\u200b被忽略。但这与第二个结果不一致。在u+'New York\u200b中,'New York\u200b'不是unicode,因此忽略\u200b。但这与你的第二个结果不一致。这是对问题的重述,而不是答案。这是对问题的重述,而不是答案。非常感谢!因此,你只将引号中的任何内容从str转换为unicode,而不是它所附加的str,并将整个类型转换为unicode?@amstree Yes。连接两个字符串时,python不会解释转义。只有在创建字符串文字时才解释转义。串联操作对所有字符的处理相同。如果要解释字符串的内容,应使用unicode转义编码。例如:b'\u2603'。解码'unicode-escape'是u'\u2603'或'☃' 而b'\u2603'.decode'ascii'是字符串u'\\u2603'。后者是一个单字符字符串,前者是由字符\u 2 6 0 3组成的6字符字符串。非常感谢!因此,你只将引号中的任何内容从str转换为unicode,而不是它所附加的str,并将整个类型转换为unicode?@amstree Yes。连接两个字符串时,python不会解释转义。只有在创建字符串文字时才解释转义。串联操作对所有字符的处理相同。如果要解释字符串的内容,应使用unicode转义编码。例如:b'\u2603'。解码'unicode-escape'是u'\u2603'或'☃' 而b'\u2603'.decode'ascii'是字符串u'\\u2603'。后者是一个单字符字符串,前者是由字符\u 2 6 0 3组成的6字符字符串。
>>> print(u'New York\u2603')
New York☃
>>> print(b'New York\u2603'.decode('ascii'))
New York\u2603