Поддерживает ли python юникод за пределами базовой многоязычной плоскости?

Ниже приведен простой тест. Кажется, что работа прекрасна. но len и x for x in , похоже, не правильно разделяют текст юникода в Python 2.6 и 2.7:

 In [1]: u"爨爵" Out[1]: u'\U0002f920\U0002f921' In [2]: [x for x in u"爨爵"] Out[2]: [u'\ud87e', u'\udd20', u'\ud87e', u'\udd21'] 

Хорошая новость: Python 3.3 делает правильную вещь ™.

Есть ли надежда для серии Python 2.x?

  • Работа с кодированными в Unicode строками из Active Directory через python-ldap
  • Проблемы с кодировкой Python и BeautifulSoup
  • UnicodeEncodeError: кодек ascii не может кодировать символы
  • Python - кодек ascii не может декодировать байт
  • UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe9' в позиции 7: порядковый номер не в диапазоне (128)
  • Как узнать, скомпилирован ли Python с UCS-2 или UCS-4?
  • subprocess.Popen с помощью пути unicode
  • Как сделать Python split () на языках (например, китайском), которые не используют пробелы в качестве разделителя слов?
  • One Solution collect form web for “Поддерживает ли python юникод за пределами базовой многоязычной плоскости?”

    Да, если вы скомпилировали свой Python с поддержкой широкого юникода.

    По умолчанию Python построен только с узкой поддержкой Unicode. Включите широкую поддержку:

     ./configure --enable-unicode=ucs4 

    Вы можете проверить, какая конфигурация была использована при тестировании sys.maxunicode :

     import sys if sys.maxunicode == 0x10FFFF: print 'Python built with UCS4 (wide unicode) support' else: print 'Python built with UCS2 (narrow unicode) support' 

    Широкая сборка будет использовать символы UCS4 для всех значений Юникода, удваивая использование памяти для них. Python 3.3 переключился на значения переменной ширины; только достаточное количество байтов используется для представления всех символов в текущем значении.

    Быстрая демонстрация, показывающая, что широкая сборка корректно обрабатывает вашу примерную строку Unicode:

     $ python2.6 Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) [GCC 4.4.5] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.maxunicode 1114111 >>> [x for x in u'\U0002f920\U0002f921'] [u'\U0002f920', u'\U0002f921'] 
    Python - лучший язык программирования в мире.