¿Cómo averiguar si Python está compilado con UCS-2 o UCS-4?
unicode ucs2 (7)
Sólo lo que dice el título.
$ ./configure --help | grep -i ucs
--enable-unicode[=ucs[24]]
Buscando la documentación oficial, encontré esto:
sys.maxunicode : un 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 está claro aquí es qué valor corresponde a UCS-2 y UCS-4.
Se espera que el código funcione en Python 2.6+.
Cuando se compila 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 carácter máximo en el modo UCS-4 se define por el valor máximo representable en UTF-16.
Otra forma es crear una matriz Unicode y observar el ítem:
import array
bytes_per_char = array.array(''u'').itemsize
Cita de los documentos de la array
:
El código de tipo
''u''
corresponde al carácter unicode de Python. En construcciones Unicode estrechas, esto es de 2 bytes, en construcciones amplias, esto es de 4 bytes.
Tenga en cuenta que la distinción entre compilaciones Unicode estrechas y anchas se python.org/dev/peps/pep-0393 de Python 3.3 en adelante, consulte python.org/dev/peps/pep-0393 . El código de tipo ''u''
para la array
está en desuso desde 3.3 y está programado para su eliminación en Python 4.0.
Tuve el mismo problema y encontré un código semioficial que hace exactamente eso y puede ser interesante para personas con el mismo problema: https://bitbucket.org/pypa/wheel/src/cf4e2d98ecb1f168c50a6de496959b4a10c6b122/wheel/pep425tags.py?at=default&fileviewer=file-view-default#pep425tags.py-83:89 .
Viene del proyecto de rueda que necesita comprobar si el python está compilado con ucs-2 o ucs-4 porque cambiará el nombre del archivo binario generado.
Tuve este mismo problema una vez. Lo documenté 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 le dirá al tamaño Unicode 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'')