web-dev-qa-db-fra.com

Comment savoir si Python est compilé avec UCS-2 ou UCS-4?

Tout ce que dit le titre.

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

En recherchant la documentation officielle, j'ai trouvé ceci:

sys.maxunicode: Un entier donnant le plus grand point de code pris en charge pour un caractère Unicode. La valeur de cela dépend de l'option de configuration qui spécifie si les caractères Unicode sont stockés en tant que UCS-2 ou UCS-4.

Ce qui n'est pas clair ici, c'est quelle valeur correspond à UCS-2 et UCS-4.

Le code devrait fonctionner sur Python 2.6+.

61
Sridhar Ratnakumar

Lorsqu'il est construit avec --enable-unicode = ucs4:

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

Lorsqu'il est construit avec --enable-unicode = ucs2:

>>> import sys
>>> print sys.maxunicode
65535
120
Stef

C'est 0xFFFF (ou 65535) pour UCS-2, et 0x10FFFF (ou 1114111) pour 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
}

Le caractère maximal en mode UCS-4 est défini par la valeur maximale représentable en UTF-16.

19
Martin v. Löwis

J'ai eu ce même problème une fois. Je l'ai documenté par moi-même sur mon wiki à

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

J'ai écrit -

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

sysconfig indiquera la taille unicode des variables de configuration de python.

Les indicateurs de build peuvent être interrogés comme ceci.

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')
8
stateoff

J'ai eu le même problème et j'ai trouvé un morceau de code semi-officiel qui fait exactement cela et peut être intéressant pour les personnes ayant le même problème: https://bitbucket.org/pypa/wheel/src/cf4e2d98ecb1f168c50a6de496959b4a10c6b122/wheel /pep425tags.py?at=default&fileviewer=file-view-default#pep425tags.py-83:89 .

Il provient du projet wheel qui doit vérifier si le python est compilé avec ucs-2 ou ucs-4 car il changera le nom du fichier binaire généré.

1
Boris Feld

Une autre façon consiste à créer un tableau Unicode et à regarder la taille de l'élément:

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

Citation des array docs :

Le 'u' le typecode correspond au caractère unicode de Python. Sur les versions Unicode étroites, cela représente 2 octets, sur les versions larges, c'est 4 octets.

Notez que la distinction entre les constructions Unicode étroites et larges est supprimée à partir de Python 3.3 en avant, voir PEP39 . Le 'u' le type de code pour array est obsolète depuis 3.3 et il est prévu de le supprimer dans Python 4.0.

1
user6758673
0
SilentGhost