Помимо получая decode
и encode
назад, я думаю, что часть ответа здесь на самом деле не используют кодировку ascii
. Скорее всего, это не то, что вы хотите.
Для начала подумайте о str
, как и в текстовом файле. Это всего лишь куча байтов без привязки к ней. То, как это интерпретируется, зависит от того, какой фрагмент кода читает его. Если вы не знаете, о чем идет речь в этом параграфе, перейдите на страницу The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets Joel прямо сейчас, прежде чем идти дальше.
Естественно, мы все знаем о создавшемся беспорядке. Ответ заключается в том, чтобы, по крайней мере, в памяти, иметь стандартную кодировку для всех строк. Вот где и находится unicode
. У меня возникли проблемы с отслеживанием того, что кодирование Python использует внутренне точно, но на самом деле это не имеет значения только для этого. Дело в том, что вы знаете, что это последовательность байтов, которые интерпретируются определенным образом. Поэтому вам нужно только подумать о самих персонажах, а не о байтах.
Проблема в том, что на практике вы сталкиваетесь с обоими.Некоторые библиотеки дают вам str
, а некоторые ожидают str
. Разумеется, это имеет смысл всякий раз, когда вы передаете последовательность байтов (например, на диск или с помощью веб-запроса или с него). Таким образом, вы должны уметь переводить вперед и назад.
Ввод codecs
: это библиотека переводов между этими двумя типами данных. Вы используете encode
для генерации последовательности байтов (str
) из текстовой строки (unicode
), и вы используете decode
для получения текстовой строки (unicode
) из последовательности байтов (str
).
Например:
>>> s = "I look like a string, but I'm actually a sequence of bytes. \xe2\x9d\xa4"
>>> codecs.decode(s, 'utf-8')
u"I look like a string, but I'm actually a sequence of bytes. \u2764"
Что здесь произошло? Я дал Python последовательность байтов, а затем я сказал: «Дайте мне версию unicode
, учитывая, что эта последовательность байтов находится в 'utf-8'
». Он сделал, как я спросил, и эти байты (a heart character) теперь рассматриваются как целое, представленное их кодовым кодом Unicode.
Пойдемте наоборот:
>>> u = u"I'm a string! Really! \u2764"
>>> codecs.encode(u, 'utf-8')
"I'm a string! Really! \xe2\x9d\xa4"
Я дал Python строку Unicode, и я попросил его перевести строку в последовательность байтов, используя 'utf-8'
кодирование. Так оно и было, и теперь сердце - это просто куча байтов, который он не может печатать как ASCII; поэтому он показывает мне шестнадцатеричный.
Мы можем работать с другими кодировками, тоже, конечно:
>>> s = "I have a section \xa7"
>>> codecs.decode(s, 'latin1')
u'I have a section \xa7'
>>> codecs.decode(s, 'latin1')[-1] == u'\u00A7'
True
>>> u = u"I have a section \u00a7"
>>> u
u'I have a section \xa7'
>>> codecs.encode(u, 'latin1')
'I have a section \xa7'
(. '\xa7'
является section character, как в Unicode и Latin-1)
Так ваш вопрос, вы первый необходимо выяснить, в какой кодировке ваш str
находится в.
ли он пришел из файла? Из веб-запроса? Из вашей базы данных? Затем источник определяет кодировку. Узнайте кодировку источника и используйте его для перевода в unicode
.
s = [get from external source]
u = codecs.decode(s, 'utf-8') # Replace utf-8 with the actual input encoding
Возможно, вы пытаетесь это где-то написать. Какую кодировку ожидает цель? Используйте это, чтобы перевести его в str
. UTF-8 - хороший выбор для текстовых документов; большинство вещей может это прочитать.
u = u'My string'
s = codecs.encode(u, 'utf-8') # Replace utf-8 with the actual output encoding
[Write s out somewhere]
Вы просто переводите назад и вперед в память для взаимодействия или чего-то еще? Затем просто выберите кодировку и придерживайтесь ее; 'utf-8'
, вероятно, является лучшим выбором для этого:
u = u'My string'
s = codecs.encode(u, 'utf-8')
newu = codecs.decode(s, 'utf-8')
В современном программировании, вы, вероятно, никогда не хотите использовать 'ascii'
кодировку для любого из этого. Это очень маленькое подмножество всех возможных символов, и никакая система, которую я знаю, не использует ее по умолчанию или что-то еще.
Python 3 делает все возможное, чтобы сделать это immensely проще, просто изменив имена.В Python 3, str
был заменен на bytes
, а unicode
был заменен на str
.
Какова ценность 'string'? Какой тип? –
Не имеет смысла декодировать объект Unicode, поскольку он уже находится в декодированной форме. Когда вы вызываете unicode_object.decode(), Python предполагает, что вы хотите декодировать байтовую строку в Unicode. Сначала он пытается кодировать объект Unicode как строку байта, используя стандартную кодировку вашей системы - это реальная ошибка, которую вы видите. – kumar303