Python的字符串是Unicode字符。

3

Python 3中的Unicode字符指的是什么?

自Python 3.0版本起,该语言提供了一个str类型,其包含Unicode字符,这意味着使用“unicode rocks!”,'unicode rocks!'或三引号语法创建的任何字符串都以Unicode形式存储。

以上为Python文档内容。

对于字符串abc,Python是否在内存中保存了[61, 62, 63]? (因为a是U+0061)

Unicode字符是否表示Unicode码点?


@hop 因为它改变了你处理字符串的方式。 - Konrad Rudolph
1
@KonradRudolph:怎么了?字符串在内存中的存储方式是对用户隐藏的,这样你就不需要知道它们的存储方式才能使用字符串。实际上,字符串在内部的存储方式取决于具体的实现,即使是CPython,在编译时也可能会有所不同。 - user3850
@hop问题是text[index]是否保证返回一个码点,还是可能返回代理对的一半。 - Konrad Rudolph
@eugene:如果你只是“好奇”,你应该首先更好地理解Unicode和编码是什么。之后,这个问题将会变得微不足道。我投票关闭。 - user3850
@KonradRudolph:1)你是怎么从OP的问题中解析出来的。2)问题中引用的文档明确提到“Unicode字符”。3)你的问题预设了一种特定的编码(即UTF-16),这并不相关,也可能不是实际使用的编码。 - user3850
1个回答

0
“Unicode字符”是指“Unicode码点”吗?
有时是,有时不是。这取决于Python的版本和构建方式。
在2.2到3.2版本之间的Python中,同时支持窄字符和宽字符的Unicode构建(参见PEP-261)。在窄字符构建中,Unicode范围仅限于BMP
Python 3.2.6 (default, Feb 21 2016, 12:42:00)
[GCC 5.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> sys.maxunicode
65535

因此,超出此范围的字符必须表示为代理对

>>> s = ''
>>> ord(s)
128556
>>> len(s)
2

随着PEP-0393的引入,Python3不再支持窄构建,因此一个字符始终等同于一个代码点:

Python 3.5.1 (default, Mar 3 2016, 09:29:07)
[GCC 5.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> sys.maxunicode
1114111
>>> s = ''
>>> ord(s)
128556
>>> len(s)
1

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