Типы Python str и Unicode

Работая с Python 2.7, мне интересно, какое реальное преимущество имеет использование unicode типа вместо str , поскольку оба они, похоже, могут хранить строки Unicode. Есть ли какая-то особая причина, из-за которой можно установить коды unicode строки unicode используя scape char \ ?:

Выполнение модуля с помощью:

 # -*- coding: utf-8 -*- a = 'á' ua = u'á' print a, ua 

Результаты в: á, á

РЕДАКТИРОВАТЬ:

Больше тестирования с использованием оболочки Python:

 >>> a = 'á' >>> a '\xc3\xa1' >>> ua = u'á' >>> ua u'\xe1' >>> ua.encode('utf8') '\xc3\xa1' >>> ua.encode('latin1') '\xe1' >>> ua u'\xe1' 

Итак, строка unicode , по-видимому, кодируется с использованием latin1 вместо utf-8 а необработанная строка кодируется с помощью utf-8 ? Я еще больше смущен! : S

  • Python не открывает японские имена файлов
  • Я правильно передаю строку в библиотеку python?
  • MIMEText UTF-8 кодирует проблемы при отправке электронной почты
  • как декодировать символ un unicode в python?
  • Преобразование байтовой строки в строку юникода
  • Python unicode Decode Error SUDs
  • Фиксация ошибочных строк Unicode
  • python - проблемы с регулярным выражением и unicode
  • 3 Solutions collect form web for “Типы Python str и Unicode”

    unicode , который является строкой python 3, предназначен для обработки текста . Текст представляет собой последовательность кодовых точек, которая может быть больше одного байта . Текст может быть закодирован в определенной кодировке для представления текста в виде необработанных байтов (например, utf-8 , latin-1 …). Обратите внимание, что unicode не закодирован ! Внутреннее представление, используемое python, представляет собой деталь реализации, и вы не должны заботиться об этом, пока он способен представлять нужные вам кодовые точки.

    Напротив, str – простая последовательность байтов . Он не представляет текст! На самом деле, в python 3 str называется bytes .

    Вы можете думать о unicode как об общем представлении некоторого текста, который может быть закодирован по-разному в последовательности двоичных данных, представленных через str .

    Некоторые отличия, которые вы можете видеть:

     >>> len(u'à') # a single code point 1 >>> len('à') # by default utf-8 -> takes two bytes 2 >>> len(u'à'.encode('utf-8')) 2 >>> len(u'à'.encode('latin1')) # in latin1 it takes one byte 1 >>> print u'à'.encode('utf-8') # terminal encoding is utf-8 à >>> print u'à'.encode('latin1') # it cannot understand the latin1 byte   

    Обратите внимание, что с использованием str вас есть элемент управления нижнего уровня для одиночных байтов определенного представления кодировки, а при использовании unicode вы можете управлять только на уровне кодовой точки. Например, вы можете:

     >>> 'àèìòù' '\xc3\xa0\xc3\xa8\xc3\xac\xc3\xb2\xc3\xb9' >>> print 'àèìòù'.replace('\xa8', '') à ìòù 

    Что раньше было действительно UTF-8, больше нет. Используя строку unicode, вы не можете работать так, чтобы результирующая строка недействительна в тексте unicode. Вы можете удалить кодовую точку, заменить кодовую точку другой точкой кода и т. Д., Но вы не можете возиться с внутренним представлением.

    Ваш терминал настроен на UTF-8.

    Тот факт, что печать работ является совпадением; вы пишете необработанные байты UTF-8 на терминал. a – значение длины два , содержащее два байта, шестнадцатеричные значения C3 и A1, а ua – значение unicode длиной один , содержащее кодовую точку U + 00E1.

    Это различие в длине является одной из основных причин использования значений Unicode; вы не можете легко измерить количество текстовых символов в байтовой строке; строка len() байтовой строки указывает вам, сколько байтов использовалось, а не количество символов, которые были закодированы.

    Вы можете видеть разницу, когда вы кодируете значение unicode для разных выходных кодировок:

     >>> a = 'á' >>> ua = u'á' >>> ua.encode('utf8') '\xc3\xa1' >>> ua.encode('latin1') '\xe1' >>> a '\xc3\xa1' 

    Обратите внимание, что первые 256 кодовых точек стандарта Unicode соответствуют стандарту Latin 1, поэтому код U + 00E1 кодируется на латиницу 1 в виде байта с шестнадцатеричным значением E1.

    Кроме того, Python использует escape-коды в представлениях unicode и байтовых строк, а нижние кодовые точки, которые не подлежат печати ASCII, представлены с использованием \x.. escape-значений. Вот почему строка Unicode с кодовой точкой между 128 и 255 выглядит так же, как кодировка Latin 1. Если у вас есть строка unicode с кодовыми точками за пределами U + 00FF, другая escape-последовательность, \u.... используется вместо этого с четырехзначным шестнадцатеричным значением.

    Похоже, вы еще не полностью понимаете, какая разница между Unicode и кодировкой. Перед продолжением прочитайте следующие статьи:

    • Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (без оправданий!) Джоэл Спольски

    • Юникод Python HOWTO

    • Прагматический Юникод от Нед Батчелдер

    Когда вы определяете a как unicode, символы a и á равны. В противном случае á считается двумя символами. Попробуйте len (a) и len (au). В дополнение к этому, возможно, потребуется кодирование при работе с другими средами. Например, если вы используете md5, вы получаете разные значения для a и ua

    Python - лучший язык программирования в мире.