Jak sprawdzić, czy Python jest kompilowany z UCS-2 lub UCS-4?

Dokładnie to, co mówi tytuł.

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

Przeszukując oficjalną dokumentację, znalazłem to:

Sys.maxunicode : liczba całkowita dająca największy obsługiwany punkt kodowy dla Znak Unicode. wartość tego zależy od opcji konfiguracji która określa, czy Unicode znaki są zapisywane jako UCS-2 lub UCS-4.

Nie jest jasne, jakie wartości odpowiadają UCS-2 i UCS-4.

The kod ma działać na Pythonie 2.6+.

Author: Sridhar Ratnakumar, 2009-09-18

7 answers

Gdy zbudowany z --enable-unicode=ucs4:

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

Gdy zbudowany z --enable-unicode=ucs2:

>>> import sys
>>> print sys.maxunicode
65535
 124
Author: Stef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-18 19:33:45

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

Maksymalny znak w trybie UCS - 4 jest określony przez wartość maxmimum reprezentowaną w UTF-16.

 19
Author: Martin v. Löwis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-18 19:20:44

Miałem kiedyś ten sam problem. Udokumentowałem to dla siebie na mojej wiki pod adresem

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

Napisałem-

import sys
sys.maxunicode > 65536 and 'UCS4' or 'UCS2'
 11
Author: Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-20 02:50:11

Sysconfig powie rozmiar unicode ze zmiennych konfiguracyjnych Pythona.

Buildflags można zapytać w ten sposób.

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')
 9
Author: stateoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-04 16:40:42

Miałem ten sam problem i znalazłem pół-oficjalny fragment kodu, który robi dokładnie to i może być interesujący 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 wheel, który musi sprawdzić, czy python jest skompilowany z ucs-2 lub UCS-4, ponieważ zmieni nazwę wygenerowanego pliku binarnego.

 1
Author: Boris Feld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 07:55:47

Innym sposobem jest utworzenie tablicy Unicode i spojrzenie na itemsize:

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

Cytat z array docs :

Typ 'u' odpowiada znakowi Unicode Pythona. Na wąskich kompilacjach Unicode jest to 2-bajt, na szerokich kompilacjach jest to 4-bajt.

Zauważ, że rozróżnienie między wąskimi i szerokimi kompilacjami Unicode jest usuwane z Pythona 3.3 dalej, zobacz PEP393 . Kod typowy 'u' dla {[1] } jest przestarzały od wersji 3.3 i zaplanowany dla usuwanie w Pythonie 4.0.

 1
Author: user6758673,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 11:43:04
 0
Author: SilentGhost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-18 19:14:20