una separar por imprimir funcion eliminar contar comparar caracteres caracter cadenas cadena python python-2.7 unicode python-unicode

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?