Ответ 1
Когда построено с --enable-unicode = ucs4:
>>> import sys
>>> print sys.maxunicode
1114111
Когда построено с --enable-unicode = ucs2:
>>> import sys
>>> print sys.maxunicode
65535
То, что говорится в названии.
$ ./configure --help | grep -i ucs
--enable-unicode[=ucs[24]]
Поиск официальной документации, я нашел это:
sys.maxunicode: целое число, дающее наибольшая поддерживаемая кодовая точка для Юникод. Значение этого зависит от опции конфигурации который определяет, будет ли Unicode символы сохраняются как UCS-2 или UCS-4.
Что неясно здесь - какое значение (-ы) соответствует UCS-2 и UCS-4.
Ожидается, что код будет работать на Python 2.6 +.
Когда построено с --enable-unicode = ucs4:
>>> import sys
>>> print sys.maxunicode
1114111
Когда построено с --enable-unicode = ucs2:
>>> import sys
>>> print sys.maxunicode
65535
Это 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.
У меня была одна и та же проблема. Я зарегистрировал его для себя в своей вики на
http://arcoleo.org/dsawiki/Wiki.jsp?page=Python%20UTF%20-%20UCS2%20or%20UCS4
Я написал -
import sys
sys.maxunicode > 65536 and 'UCS4' or 'UCS2'
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')
Другой способ - создать массив 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.
65535 - UCS-2:
У меня была такая же проблема, и я нашел полуофициальный кусок кода, который делает именно это и может быть интересен для людей с одинаковой проблемой: 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, потому что он изменит имя созданного двоичного файла.