Я знаю, что django использует строки unicode по всей структуре вместо обычных строк python. Какая кодировка - это обычные строки python? и почему они не используют unicode?
Какую кодировку используют обычные строки python?
Ответ 1
Из Python 3.0 во всех строках по умолчанию используется unicode, есть также тип данных байтов (Документация Python).
Поэтому разработчики python считают, что использование unicode - хорошая идея, что он не используется универсально в python 2, в основном из-за обратной совместимости. Это также имеет последствия для производительности.
Ответ 2
Стандартные строки Python (Python 2.x str
) не имеют кодировки: они являются необработанными данными. В Python 3 они называются "байтами", которые являются точным описанием, поскольку они представляют собой просто последовательности байтов, которые могут быть закодированы в кодировке любой кодировки (некоторые из них являются общими!) Или нетекстовыми данными вообще.
Для представления текста вам нужны строки unicode, а не байтовые строки. unicode
экземпляры представляют собой последовательности кодовых точек unicode, представленных абстрактно без кодирования; это хорошо подходит для представления текста.
Быстрые значения важны, потому что для представления данных для передачи по сети или записи в файл или что-то еще, вы не можете иметь абстрактное представление unicode, вам нужно конкретное представление байтов. Хотя они часто используются для хранения и представления текста, это, по крайней мере, немного озорной.
Вся эта ситуация осложняется тем, что, хотя вы должны поменять unicode на байты, вызывая encode
и превращая байты в unicode с помощью decode
, Python попытается сделать это автоматически для вас, используя глобальную кодировку, которую вы можете установить то есть по умолчанию ASCII, что является самым безопасным выбором. Никогда не зависеть от этого для своего кода и никогда не меняйте его на более гибкую кодировку - явно декодируйте, когда вы получаете байтовую и кодировку, если вам нужно отправить строку где-то внешнюю.
Ответ 3
Эй! Я хотел бы добавить некоторые вещи к другим ответам, к сожалению, у меня пока нет достаточного количества повторений, чтобы сделать это правильно: - (
FWIW, сообщение Майка Грэма довольно хорошо, и возможно, что вы должны читать в первую очередь.
Вот несколько комментариев:
- Необходимость префикса символов unicode с "u" в 2.x довольно легко удаляется в недавних (2.6+) 2.x Pythons.
from __future__ import unicode_literals
- Simialrly, ASCII - это только исходная кодировка по умолчанию. Python понимает множество подсказок, включая стиль emacs
# -*- coding: utf-8 -*-
. Для получения дополнительной информации см. PEP 0263. Изменение кодировки источника влияет на то, как интерпретируются литералы Юникода (независимо от их префикса или отсутствия префикса, в зависимости от точки 1). В Py3k кодировкой по умолчанию является UTF-8. - Python, конечно, использует внутреннюю кодировку для строк Unicode (
str
в py3k,unicode
в 2.x), потому что в некоторый момент времени вещи должны быть записаны в память. В идеале это никогда не будет очевидно для конечного пользователя. К сожалению, ничего идеального, и вы можете иногда сталкиваться с такими проблемами: особенно если вы используете фанки-скригинг за пределами многоязычной платформы Unicode Base. С Python 2.2 у нас было то, что называлось широкими сборками и узкими строками; эти имена относятся к типу, используемому внутренне для хранения кодовых точек Unicode. Широкие сборки используют UCS-4, который использует 4 байта для хранения кодовой точки Unicode. (Это означает, что размер блока кода UCS-4 составляет 4 байта или 32 бита.) Узкие сборки используют UCS-2. UCS-2 имеет только 16 бит и поэтому не может точно кодировать все кодовые точки Юникода (это похоже на UTF-16, за исключением без суррогатных пар). Чтобы проверить, проверьте значениеsys.maxunicode
. Если он1114111
, у вас есть широкая сборка (которая может корректно отображать все Unicode). Если это меньше, ну, не слишком волнуйся. BMP (коды0x0000
до0xFFFF
) охватывает большинство людей. Для получения дополнительной информации см. PEP 0261.
Ответ 4
Строки Python 2.x являются 8-битными, и ничего больше. Кодировка может меняться (хотя предполагается ASCII). Я думаю, что причины исторические. Немногие языки, особенно языки, относящиеся к прошлому столетию, сразу же используют Юникод.
В Python 3 все строки являются юникодами.
Ответ 5
какая кодировка является обычным питоном строки используются?
В Python 3.x
str
- Unicode. Это может быть UTF-16 или UTF-32 в зависимости от того, был ли ваш интерпретатор Python построен с "узкими" или "широкими" символами Unicode.
В Windows-версии CPython используется UTF-16. В Unix-подобных системах UTF-32 имеет тенденцию быть предпочтительным.
В Python 2.x
str
- это тип байтовой строки, такой как C char
. Кодировка не определяется языком, но это независимо от вашей кодировки по умолчанию для локали. Или независимо от того, какая кодировка MIME документа вы вышли из Интернета. Или, если вы получаете строку от функции типа struct.pack
, это двоичные данные и вообще не имеют символьной кодировки вообще.
unicode
строки в 2.x эквивалентны str
в 3.x.
и почему они не используют unicode?
Поскольку Python (слегка) предшествует Unicode. И поскольку Гвидо хотел сохранить все основные несовместимые изменения в версии 3.0. Строки в 3.x действительно используют Unicode по умолчанию.
Ответ 6
До Python 3.0 по умолчанию была строка ascii
, но ее можно было изменить. Строковые литералы Юникода были u"..."
. Это было глупо.