Подтвердить что ты не робот

Как узнать, скомпилирован ли Python с UCS-2 или UCS-4?

То, что говорится в названии.

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

Поиск официальной документации, я нашел это:

sys.maxunicode: целое число, дающее наибольшая поддерживаемая кодовая точка для Юникод. Значение этого зависит от опции конфигурации который определяет, будет ли Unicode символы сохраняются как UCS-2 или UCS-4.

Что неясно здесь - какое значение (-ы) соответствует UCS-2 и UCS-4.

Ожидается, что код будет работать на Python 2.6 +.

4b9b3361

Ответ 1

Когда построено с --enable-unicode = ucs4:

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

Когда построено с --enable-unicode = ucs2:

>>> import sys
>>> print sys.maxunicode
65535

Ответ 2

Это 0xFFFF (или 65535) для UCS-2 и 0x10FFFF (или 1114111) для 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
}

Максимальный символ в режиме UCS-4 определяется максимальным значением, представляемым в UTF-16.

Ответ 4

sysconfig будет сообщать размер юникода из переменных конфигурации python.

Флаги сборки можно запросить следующим образом.

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

Ответ 5

Другой способ - создать массив Unicode и посмотреть на itemsize:

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

Цитата из array docs:

Код типа 'u' соответствует символу юникода Pythons. На узких Unicode-сборках это 2-байтовый, на больших строках это 4-байтовый.

Обратите внимание, что различие между узкими и широкими строками Unicode сбрасывается с Python 3.3 дальше, см. PEP393. 'u' typecode для array устарел с 3,3 и запланирован для удаления в Python 4.0.

Ответ 7

У меня была такая же проблема, и я нашел полуофициальный кусок кода, который делает именно это и может быть интересен для людей с одинаковой проблемой: https://bitbucket.org/pypa/wheel/src/cf4e2d98ecb1f168c50a6de496959b4a10c6b122/wheel/pep425tags.py?at=default&fileviewer=file-view-default#pep425tags.py-83:89.

Он исходит из проекта wheel, который должен проверить, скомпилирован ли python с помощью ucs-2 или ucs-4, потому что он изменит имя созданного двоичного файла.