¿Cómo saber si Python se compila con UCS-2 o UCS-4?
Pregunta
Justo 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 entero que da mayor punto de código compatible para un Carácter Unicode. El valor de esto depende de la opción de configuración que especifica si Unicode los caracteres se almacenan como UCS-2 o UCS-4.
Lo que no está claro aquí es qué valores corresponden a UCS-2 y UCS-4.
Se espera que el código funcione en Python 2.6+.
Solución
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
Otros consejos
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 modo UCS-4 está definido por el valor máximo representable en UTF-16.
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 indicará el tamaño unicode de las variables de configuración de python.
Las banderas de compilación 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é un código semioficial que hace exactamente eso y puede ser interesante para las personas con el mismo problema:
Otra forma es crear una matriz Unicode y ver el tamaño del elemento: Cita de El código de tipo Tenga en cuenta que la distinción entre compilaciones Unicode estrechas y anchas se elimina de Python 3.3 en adelante, consulte PEP393 . El código de tipo import array
bytes_per_char = array.array('u').itemsize
array
docs :
'u'
corresponde al carácter unicode de Python. En compilaciones Unicode estrechas esto es de 2 bytes, en compilaciones anchas esto es de 4 bytes. 'u'
para array
está en desuso desde 3.3 y está programado para su eliminación en Python 4.0.