2009-09-18 3 views
55

To, co mówi tytuł.Jak sprawdzić, czy Python jest skompilowany z UCS-2 lub UCS-4?

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

Przeszukiwanie oficjalnej dokumentacji, znalazłem to:

sys.maxunicode: Liczba całkowita podając największej obsługiwanej punkt kod dla znak Unicode. Wartość o wartości tego zależy od opcji konfiguracyjnej , która określa, czy znaki Unicode są przechowywane jako UCS-2 lub UCS-4.

To, co nie jest tu jasne, to - jakie wartości odpowiadają UCS-2 i UCS-4.

Kod powinien działać na Pythonie 2.6+.

Odpowiedz

101

Kiedy zbudowany z --enable-unicode = ucs4:

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

Kiedy zbudowany z --enable-unicode = UCS2:

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

Nie jest to już powszechnie poprawne w przypadku Pythona 3. Zobacz https://docs.python.org/3.4/c-api/unicode.html: 'Od czasu wdrożenia PEP 393 w Pythonie 3.3, obiekty Unicode używają wewnętrznie różnorodność przedstawień ". https://www.python.org/dev/peps/pep-0393/ –

+2

@ Jan-PhilipGehrcke: 'deficient_unicode_build = (sys.maxunicode <0x10ffff)' działa na dowolnej wersji Pythona (nawet jeśli elastyczna wewnętrzna reprezentacja jest używana gdzie 'sys.maxunicode == 0x10ffff'). Elastyczne reprezentacje umożliwiają uzyskanie poprawnych wyników, takich jak ucs4 w poprzednich wersjach, w niektórych przypadkach z mniejszą ilością pamięci niż ucs4. – jfs

18

To 0xFFFF (lub 65535) przez UCS-2 i 0x10FFFF (lub 1114111) przez 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 
} 

Maksymalna liczba znaków w trybie UCS-4 jest zdefiniowana jako maksymalna wartość reprezentowana w UTF-16.

4

sysconfig powie rozmiar unicode od zmiennych konfiguracyjnych Pythona.

Można zapytać o takie pliki.

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

miałem ten sam problem i okazało się pół-oficjalny kawałek kodu, który robi dokładnie to i może być interesująca dla osób z tym samym problemem: https://bitbucket.org/pypa/wheel/src/cf4e2d98ecb1f168c50a6de496959b4a10c6b122/wheel/pep425tags.py?at=default&fileviewer=file-view-default#pep425tags.py-83:89.

Pochodzi z projektu koła, który musi sprawdzić, czy python jest skompilowany z ucs-2 lub ucs-4, ponieważ zmieni nazwę wygenerowanego pliku binarnego.

1

Innym sposobem jest utworzenie tablicy Unicode i spojrzeć na itemsize:

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

cytat z array docs:

'u' Kod typu odpowiadający unicode charakter Pythona. W wąskich kompilacjach Unicode jest to 2-bajty, a na szerokich kompilacjach 4-bajtowych.

Należy zauważyć, że rozróżnienie między wąskimi i szerokimi kompozycjami w standardzie Unicode zostało usunięte z języka Python 3.3, patrz PEP393. Kod 'u' dla array jest przestarzały od wersji 3.3 i jest zaplanowany do usunięcia w Pythonie 4.0.

Powiązane problemy