separar - input python
Python devuelve una longitud de 2 para una sola cadena de caracteres Unicode (1)
Su binario Python fue compilado con soporte UCS-2 (una construcción estrecha ) e internamente todo lo que esté fuera del BMP (plano multilingüe básico) se representa utilizando un par suplente .
Eso significa que dichos puntos de código aparecen como 2 caracteres cuando se solicita la longitud.
Deberá recompilar el binario de Python para usar UCS-4 en su lugar, si esto es importante ( ./configure --enable-unicode=ucs4
habilitado ./configure --enable-unicode=ucs4
lo habilitará), o actualizar a Python 3.3 o posterior, donde el soporte de Unicode de Python fue revisado para usar un tipo Unicode de ancho variable que cambia entre ASCII, UCS-2 y UCS-4 según lo requieran los puntos de código contenidos.
En las versiones de Python 2.7 y 3.0 - 3.2, puede detectar qué tipo de compilación tiene inspeccionando el valor de sys.maxunicode
; será 2^16-1 == 65535 == 0xFFFF
para una versión reducida de UCS-2, 1114111 == 0x10FFFF
para una construcción amplia de UCS-4. En Python 3.3 y posteriores, siempre se establece en 1114111.
Manifestación:
# 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'']
En 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
Como unicode_str
solo contiene un único punto de código Unicode (0x0001f44d), ¿por qué len(unicode_str)
devuelve 2 en lugar de 1?