Come scoprire se Python è compilato con UCS-2 o UCS-4?
Domanda
Proprio quello che dice il titolo.
$ ./configure --help | grep -i ucs
--enable-unicode[=ucs[24]]
Cercando la documentazione ufficiale, ho trovato questo:
sys.maxunicode : Un numero intero che indica il il più grande punto di codice supportato per a Carattere Unicode. Il valore di questo dipende dall'opzione di configurazione che specifica se Unicode i caratteri sono memorizzati come UCS-2 o UCS-4.
Ciò che non è chiaro qui è - quale valore (i) corrisponde a UCS-2 e UCS-4.
Il codice dovrebbe funzionare su Python 2.6+.
Soluzione
Se creato con --enable-unicode = ucs4:
>>> import sys
>>> print sys.maxunicode
1114111
Se creato con --enable-unicode = ucs2:
>>> import sys
>>> print sys.maxunicode
65535
Altri suggerimenti
Sono 0xFFFF (o 65535) per UCS-2 e 0x10FFFF (o 1114111) per 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
}
Il carattere massimo in modalità UCS-4 è definito dal valore massimo rappresentabile in UTF-16.
Ho avuto lo stesso problema una volta. L'ho documentato da solo sul mio wiki su
http://arcoleo.org /dsawiki/Wiki.jsp?page=Python%20UTF%20-%20UCS2%20or%20UCS4
Ho scritto -
import sys
sys.maxunicode > 65536 and 'UCS4' or 'UCS2'
sysconfig indicherà la dimensione dell'unicode dalle variabili di configurazione di python.
I flag di build possono essere interrogati in questo modo.
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')
Ho avuto lo stesso problema e ho trovato un codice semi-ufficiale che fa esattamente questo e potrebbe essere interessante per le persone con lo stesso problema: https://bitbucket.org/pypa/wheel/src/cf4e2d98ecb1f168c50a6de496959b4a10c6b122/wheel /pep425tags.py?at=default&fileviewer=file-view-default#pep425tags.py-83:89 .
Viene dal progetto wheel che deve verificare se il python è compilato con ucs-2 o ucs-4 perché cambierà il nome del file binario generato.
Un altro modo è quello di creare un array Unicode e guardare le dimensioni degli elementi:
import array
bytes_per_char = array.array('u').itemsize
Citazione dai array
docs :
Il codice di tipo
'u'
corrisponde al carattere unicode di Python. Nelle build Unicode strette si tratta di 2 byte, nelle build wide si tratta di 4 byte.
Nota che la distinzione tra build Unicode strette e larghe viene eliminata da Python 3.3 in poi, vedi PEP393 . Il codice di tipo 'u'
per array
è obsoleto dal 3.3 e pianificato per la rimozione in Python 4.0.