在 Python 2.7 中:
In [2]: utf8_str = '\xf0\x9f\x91\x8d'
In [3]: print(utf8_str)
????
In [4]: unicode_str = utf8_str.decode('utf-8')
In [5]: print(unicode_str)
????
In [6]: unicode_str
Out[6]: u'\U0001f44d'
In [7]: len(unicode_str)
Out[7]: 2
Since unicode_str
只包含一个 unicode 代码点 (0x0001f44d),为什么len(unicode_str)
返回 2 而不是 1?
您的 Python 二进制文件是使用 UCS-2 支持编译的(anarrowbuild),并且内部 BMP(基本多语言平面)之外的任何内容都使用代理对 https://en.wikipedia.org/wiki/UTF-16#U.2B10000_to_U.2B10FFFF.
这意味着在询问长度时,此类代码点会显示为 2 个字符。
如果这很重要,您必须重新编译 Python 二进制文件才能使用 UCS-4 (./configure --enable-unicode=ucs4
将启用它),或升级到 Python 3.3 或更高版本,其中Python 对 Unicode 支持进行了彻底修改 https://docs.python.org/3/whatsnew/3.3.html#pep-393使用可变宽度 Unicode 类型,根据所包含的代码点的需要在 ASCII、UCS-2 和 UCS-4 之间切换。
在 Python 版本 2.7 和 3.0 - 3.2 上,您可以通过检查来检测您拥有的构建类型sys.maxunicode value https://docs.python.org/2/library/sys.html#sys.maxunicode;这将是2^16-1 == 65535 == 0xFFFF
对于狭窄的 UCS-2 构建,1114111 == 0x10FFFF
适用于广泛的 UCS-4 构建。在 Python 3.3 及更高版本中,它始终设置为 1114111。
Demo:
# Narrow build
$ bin/python -c 'import sys; print sys.maxunicode, len(u"\U0001f44d"), list(u"\U0001f44d")'
65535 2 [u'\ud83d', u'\udc4d']
# Wide build
$ python -c 'import sys; print sys.maxunicode, len(u"\U0001f44d"), list(u"\U0001f44d")'
1114111 1 [u'\U0001f44d']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)