¿Cómo saber si Python está comstackdo con UCS-2 o UCS-4?

Sólo lo que dice el título.

$ ./configure --help | grep -i ucs --enable-unicode[=ucs[24]] 

Buscando en la documentación oficial, encontré esto:

sys.maxunicode : un número entero que proporciona el punto de código admitido más grande para un carácter Unicode. El valor de esto depende de la opción de configuración que especifica si los caracteres Unicode se almacenan como UCS-2 o UCS-4.

Lo que no queda claro aquí es qué valores corresponden a UCS-2 y UCS-4.

Se espera que el código funcione en Python 2.6+.

Cuando se construye con –enable-unicode = ucs4:

 >>> import sys >>> print sys.maxunicode 1114111 

Cuando se construye con –enable-unicode = ucs2:

 >>> import sys >>> print sys.maxunicode 65535 

Es 0xFFFF (o 65535) para UCS-2, y 0x10FFFF (o 1114111) para UCS-4:

 Py_UNICODE PyUnicode_GetMax(void) { #ifdef Py_UNICODE_WIDE return 0x10FFFF; #else /* This is actually an illegal character, so it should not be passed to unichr. */ return 0xFFFF; #endif } 

El máximo carácter en el modo UCS-4 se define por el valor maxmimum representable en UTF-16.

Tuve este mismo problema una vez. Lo documenté por mi mismo en mi wiki en

http://arcoleo.org/dsawiki/Wiki.jsp?page=Python%20UTF%20-%20UCS2%20or%20UCS4

Escribí –

 import sys sys.maxunicode > 65536 and 'UCS4' or 'UCS2' 

sysconfig indicará el tamaño de Unicode a partir de las variables de configuración de Python.

Los buildflags se pueden consultar de esta manera.

Python 2.7:

 import sysconfig sysconfig.get_config_var('Py_UNICODE_SIZE') 

Python 2.6:

 import distutils distutils.sysconfig.get_config_var('Py_UNICODE_SIZE') 

Tuve el mismo problema y encontré una pieza de código semioficial que hace exactamente eso y puede ser interesante para las personas con el mismo problema: https://bitbucket.org/pypa/wheel/src/cf4e2d98ecb1f168c50a6de496959b4a10c6b122/wheel/pep425ctf ? at = default & fileviewer = file-view-default # pep425tags.py-83: 89 .

Viene del proyecto de la rueda que necesita verificar si el python está comstackdo con ucs-2 o ucs-4 porque cambiará el nombre del archivo binario generado.

Otra forma es crear una matriz Unicode y mirar el tamaño de los elementos:

 import array bytes_per_char = array.array('u').itemsize 

Cita de la array documentos :

El código de tipo 'u' corresponde al carácter Unicode de Python. En las comstackciones Unicode estrechas, esto es de 2 bytes, en las comstackciones amplias, esto es de 4 bytes.

Tenga en cuenta que la distinción entre comstackciones Unicode estrechas y anchas se elimina de Python 3.3 en adelante, consulte PEP393 . El código de tipo 'u' para la array está en desuso desde la versión 3.3 y está progtwigdo para su eliminación en Python 4.0.

65535 es UCS-2:

Por lo tanto, el punto de código U + 0000 se codifica como el número 0, y U + FFFF se codifica como 65535 (que es FFFF16 en hexadecimal).