Итак, обо всем по порядку: вы должны использовать Python 3, а не Python 2.
Обработка текста и Unicode - это основное различие между двумя версиями языка и реальной причиной их появления.делать несовместимые изменения, и это намного , намного более просто в Python 3.
Это означает, что для разговора о юникоде в Python 2 необходимо понимать определенные вещи- Юникод используется для представления текста : символы независимо от базового представления, которое имеют эти символы.
В программах на Python 2 весь текст, набранный в самой программе, должен быть набран с помощью "u"префиксные строки, такие как u"..."
или u'...'
- в противном случае строки считаются "байтовыми строками" - точно так же, как в C-коде.(В качестве альтернативы можно поместить from __future__ import unicode_literals
в первую или вторую строку файла, так что это делается автоматически.
В противном случае все данные, считываемые в программу, либо из текстовых файлов, из подключений к базе данных, из входящего HTTPзапросы, обычно получаются как byte строки в Python2 и должны быть явно преобразованы в текстовые строки (то есть "объекты Unicode" в языке Python 2) перед обработкой. Это делается путем вызова bytes-метод string .decode
- и вы передаете ему в качестве первого параметра имя кодировки, используемое для этих байтов, то есть, если у вас есть данные, которые вы прочитали из кодированного файла utf-8
, его можно декодировать в текст, выполнив:
data = data.decode("utf-8") # and so on for other encodings.
Кроме того, если вы набираете любой не-ascii символ в исходном коде файла Python2, независимо от того, находится ли он внутри строки (или, например, внутри комментария), вы должныобъявите кодировку файла в первой строке файла.
Это делается с помощью комментария Python, который обрабатывается специальным образом языком.Анализатор - первый LoC должен содержать:
# encoding: utf-8
(конечно, вы должны ввести кодировку, фактически используемую вашим программным редактором для хранения файла.Кроме того, допускаются некоторые варианты этой маркировки, например, «кодирование» вместо кодирования, «:» является необязательным и т. Д.)
Итак - то, что я описал в предыдущем 5 параграфы выполняются автоматически в Python 3. Но если вы до сих пор следили, у вас теперь есть программа, работающая с текстом, который нужно обработать.Как вы понимаете, вы не упомянули в своем вопросе , как вы вводите этот текст, который хотите кодировать различными способами.
Итак, точно так же, как вы явно преобразовали входные байты в строки юникода в памяти, теперь вы можете использовать метод .encode
для преобразования текста обратно в любую кодировку текста, которую вы хотите.
Если у вас есть какой-то текст, который вы хотите записать в текстовом файле с кодировкой utf-32 little endian, вы делаете:
with open("myfile.txt", "wt") as file_:
file_.write(data.encode("utf-32 LE"))
Действительные текстовые кодеки перечислены согласноОтвет Эрана по адресу:
https://docs.python.org/2/library/codecs.html#standard-encodings
Теперь, если вы проведете несколько тестов с этим и добьетесь успеха, вам лучше сделать две вещи, прежде чем продолжить дальше:
переключитесь на использование Python 3. Python 2 в настоящий момент устарел - проверьте, не установлен ли он в вашей системе, набрав «python3» вместо «Python».Если это не так, просто установите его - он может жить бок о бок с Python2
- Читать эту статью , чтобы понять, что на самом деле происходит, когда мы говоримпро юникод в кодировках.(Автор, Джоэл, является основателем самого Stackoverflow, статья написана в 2003 году)