2009-09-18 5 views
55

Justo lo que dice el título.¿Cómo saber si Python está compilado con UCS-2 o UCS-4?

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

Búsqueda en la documentación oficial, encontré esto:

sys.maxunicode: Entero que proporciona el mayor punto de código apoyado por un personaje Unicode. El valor de este 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 (es) corresponde a UCS-2 y UCS-4.

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

Respuesta

101

Cuando se construyó con --enable-Unicode = ucs4:

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

Cuando se construyó con --enable-Unicode = ucs2:

>>> import sys 
>>> print sys.maxunicode 
65535 
+2

Ya no es universalmente correcto para Python 3. Consulte https://docs.python.org/3.4/c-api/unicode.html: 'Desde la implementación de PEP 393 en Python 3.3, los objetos Unicode utilizan internamente un variedad de representaciones'. https://www.python.org/dev/peps/pep-0393/ –

+2

@ Jan-PhilipGehrcke: 'deficient_unicode_build = (sys.maxunicode <0x10ffff)' funciona en cualquier versión de Python (incluso si se usa la representación interna flexible donde 'sys.maxunicode == 0x10ffff'). Las representaciones flexibles permiten obtener resultados correctos, como lo hizo ucs4 en versiones anteriores, mientras que usaba menos memoria que ucs4 en algunos casos. – jfs

18

Es 0xFFFF (o 65535) para UCS-2, y 0x10ffff (o 1.114.111) 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 está definido por el máximo valor máximo representable en UTF-16.

4

sysconfig le dirá el tamaño de Unicode de las variables de configuración de pitón.

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') 
1

Yo tenía el mismo problema y encontró una pieza semi-oficial de código 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 se compila con ucs-2 o ucs-4 porque cambiará el nombre del archivo binario generado.

1

Otra forma es crear una matriz de Unicode y mirar el ItemSize:

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

Presupuesto de la array docs:

El código de tipo 'u' corresponde a caracteres 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 las construcciones Unicode estrechas y anchas se elimina de Python 3.3 en adelante, consulte PEP393. El código de tipo 'u' para array está en desuso desde 3.3 y está programado para su eliminación en Python 4.0.

Cuestiones relacionadas