Как узнать, скомпилирован ли 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+.

7 Solutions collect form web for “Как узнать, скомпилирован ли Python с UCS-2 или UCS-4?”

Когда построено с –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 и просмотр элементов:

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

Цитата из array docs :

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

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

65535 – UCS-2:

Таким образом, кодовая точка U + 0000 кодируется как число 0, а U + FFFF кодируется как 65535 (что является FFFF16 в шестнадцатеричном виде).

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

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

  • Имена файлов Unicode в Windows с Python & subprocess.Popen ()
  • Установить кодировку в сценариях Python 3 CGI
  • Запросы на бутылки Python и unicode
  • Unicode или что в matplotlib?
  • Работа со строкой, содержащей несколько кодировок символов
  • Получить «фактическую» длину строки в символах Юникода
  • json.loads () дает исключение, что он ожидает значение, похоже, что значение есть
  • unicode и кодировка для персидского или арабского в python3
  • unicode (). decode ('utf-8', 'ignore'), поднимающий UnicodeEncodeError
  • разделение строки юникода на слова
  • соответствие символов Unicode в регулярных выражениях python
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.