Какую кодировку используют обычные строки Python? - PullRequest
13 голосов
/ 23 августа 2010

я знаю, что django использует строки юникода по всей структуре вместо обычных строк python Какую кодировку используют обычные строки Python? и почему они не используют Unicode?

Ответы [ 6 ]

29 голосов
/ 23 августа 2010

В Python 2: Обычные строки (Python 2.x str) не имеют кодировки: они являются необработанными данными.

В Python 3: Они называются «байтами», что является точным описанием, поскольку они представляют собой просто последовательности байтов, которые могут быть закодированы в тексте в любой кодировке (некоторые из них общие!) или нетекстовые данные в целом.

Для представления text вам нужны строки Unicode, а не байтовые строки. Под "строками Unicode" я имею в виду unicode экземпляры в Python 2 и str экземпляры в Python 3. Строки Unicode - это последовательности кодовых точек Unicode, представленные абстрактно без кодировки; это хорошо подходит для представления текста.

Строки байтов важны, потому что для представления данных для передачи по сети или записи в файл или что-то еще у вас не может быть абстрактного представления юникода, вам нужно конкретное представление байтов. Хотя они часто используются для хранения и представления текста, это, по крайней мере, немного непослушно.

Вся эта ситуация осложняется тем фактом, что, хотя вы должны превратить юникод в байты, вызвав encode и превратить байты в юникод, используя decode, Python попытается сделать это автоматически, используя Вы можете установить глобальную кодировку, которая по умолчанию является ASCII, что является самым безопасным выбором. Никогда не полагайтесь на это для своего кода и никогда не меняйте его на более гибкую кодировку - явно декодируйте, когда вы получаете строку байтов, и кодируйте, если вам нужно отправить строку куда-то за пределы.

14 голосов
/ 23 августа 2010

Эй!Я хотел бы добавить кое-что к другим ответам, к сожалению, у меня еще недостаточно представителей, чтобы сделать это должным образом: - (

FWIW, пост Майка Грэма довольно хорош, и это, вероятно, то, что вы должны прочитатьfirst.

Вот несколько комментариев:

  1. Необходимость префикса литералов юникода с "u" в 2.x довольно легко удаляется в последних (2.6+) 2.x Pythons. from __future__ import unicode_literals
  2. Simialrly, ASCII является только исходной кодировкой по умолчанию. Python понимает различные подсказки кодирования, включая стиль emacs # -*- coding: utf-8 -*-. Для получения дополнительной информации см. PEP 0263 . Изменениеисходная кодировка влияет на интерпретацию литералов Unicode (независимо от их префикса или отсутствия префикса, на что влияет точка 1.) В Py3k кодировкой файлов по умолчанию является UTF-8.
  3. Python, конечно, используетвнутреннее кодирование для строк Unicode (str в py3k, unicode в 2.x), потому что в какой-то момент вещи должны быть записаны в память. В идеале, это никогда не будет очевидноконечный пользователь.К сожалению, нет ничего идеального, и вы можете время от времени сталкиваться с проблемами: особенно если вы используете забавные закорючки за пределами базовой многоязычной плоскости Unicode.Начиная с Python 2.2 у нас были так называемые ширины сборки и узкие сборки;эти имена относятся к типу, используемому для хранения кодовых точек Unicode.Широкие сборки используют UCS-4, который использует 4 байта для хранения кодовой точки Unicode.(Это означает, что размер кодовой единицы UCS-4 составляет 4 байта или 32 бита.) Узкие сборки используют UCS-2.UCS-2 имеет только 16 битов, и поэтому не может точно кодировать все кодовые точки Unicode (это похоже на UTF-16, кроме как без суррогатных пар).Чтобы проверить, проверьте значение sys.maxunicode.Если это 1114111, у вас широкая сборка (которая может правильно представлять весь Юникод).Если это меньше, ну, не волнуйтесь слишком сильно.BMP (кодовые точки 0x0000 до 0xFFFF) покрывает потребности большинства людей.Для получения дополнительной информации см. PEP 0261 .
2 голосов
/ 24 августа 2010

Какую кодировку используют обычные строки Python?

В Python 3.x

str - это Unicode.Это может быть либо UTF-16, либо UTF-32, в зависимости от того, был ли ваш интерпретатор Python построен на «узких» или «широких» символах Unicode.

Версия CPython для Windows использует UTF-16.В Unix-подобных системах предпочтение отдается UTF-32.

В Python 2.x

str - это тип байтовой строки, такой как C char,Кодировка не определяется языком, но является любой другой кодировкой по умолчанию для вашей локали.Или какой бы ни была кодировка MIME документа, который вы получили из Интернета.Или, если вы получаете строку из функции, такой как struct.pack, это двоичные данные и вообще не имеет кодировки символов.

unicode строки в 2.x эквивалентны str в 3.x.

и почему они не используют юникод?

Поскольку Python (немного) предшествует Юникоду.И потому что Гвидо хотел сохранить все основные обратно несовместимые изменения для 3.0.Строки в 3.x do по умолчанию используют Unicode.

1 голос
/ 23 августа 2010

Python 2.x строки 8-битные, не более того. Кодировка может отличаться (хотя предполагается ASCII). Я думаю, причины исторические. Немногие языки, особенно языки, относящиеся к прошлому веку, сразу используют юникод.

В Python 3 все строки в Unicode.

1 голос
/ 23 августа 2010

В Python 3.0 все строки по умолчанию имеют юникод, также есть тип данных байтов ( Документация Python ).

Таким образом, разработчики python считают, что использование unicode - это хорошая идея, что он не используется повсеместно в python 2 в основном из-за обратной совместимости. Это также влияет на производительность.

0 голосов
/ 23 августа 2010

До Python 3.0 строковое кодирование было ascii по умолчанию, но его можно было изменить. Строковые литералы Unicode были u"...". Это было глупо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...