Tom*_*Tom 7 python unicode python-2.7 python-unicode
在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
Run Code Online (Sandbox Code Playgroud)
由于unicode_str
只包含一个unicode代码点(0x0001f44d),为什么len(unicode_str)
返回2而不是1?
Mar*_*ers 15
您的Python二进制文件是使用UCS-2支持(一个窄版本)编译的,内部BMP(基本多语言平面)之外的任何内容都使用代理项对来表示.
这意味着这些代码点在询问长度时会显示为2个字符.
你必须重新编译你的Python二进制文件才能使用UCS-4,如果这很重要(./configure --enable-unicode=ucs4
将启用它),或升级到Python 3.3或更高版本,其中Python的Unicode支持进行了大修,以使用在ASCII之间切换的可变宽度Unicode类型,包含的代码点所要求的UCS-2和UCS-4.
在Python版本2.7和3.0 - 3.2上,您可以通过检查sys.maxunicode
值来检测您拥有的构建类型; 它2^16-1 == 65535 == 0xFFFF
适用于狭窄的UCS-2构建,1114111 == 0x10FFFF
适用于广泛的UCS-4构建.在Python 3.3及更高版本中,它始终设置为1114111.
演示:
# 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']
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1302 次 |
最近记录: |