Как узнать, скомпилирован ли Python с UCS-2 или UCS-4? - PullRequest
61 голосов
/ 18 сентября 2009

Как раз то, что написано в названии.

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

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

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

Здесь неясно, какие значения соответствуют UCS-2 и UCS-4.

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

Ответы [ 7 ]

119 голосов
/ 18 сентября 2009

При сборке с --enable-unicode = ucs4:

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

При сборке с --enable-unicode = ucs2:

>>> import sys
>>> print sys.maxunicode
65535
19 голосов
/ 18 сентября 2009

Это 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.

11 голосов
/ 20 сентября 2009

Однажды у меня была такая же проблема. Я задокументировал это для себя в своей вики на

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

Я написал -

import sys
sys.maxunicode > 65536 and 'UCS4' or 'UCS2'
8 голосов
/ 04 марта 2016

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')
1 голос
/ 07 сентября 2016

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

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

Цитата из array документов :

Тип-код 'u' соответствует юникод-символу Python. В узких сборках Unicode это 2 байта, в широких сборках это 4 байта.

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

1 голос
/ 17 августа 2016

У меня была такая же проблема, и я нашел полуофициальный фрагмент кода, который делает именно это и может быть интересным для людей с такой же проблемой: 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, потому что он изменит имя сгенерированного двоичного файла.

...