Есть ли способ указать, какой формат Unicode используется в кодировке Unicode в Python 2.7? - PullRequest
0 голосов
/ 18 июня 2019

, поэтому я хотел бы закодировать некоторые значения в Unicode в моем скрипте Python 2.7. Я хотел бы знать, могу ли я указать, какой тип Unicode использовать, то есть UTF-8 против UTF-32. Кроме того, существуют ли какие-либо ограничения в отношении того, какие кодировки поддерживаются в Python 2.7 и как определяется кодировка по умолчанию?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Итак, обо всем по порядку: вы должны использовать 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 году)
0 голосов
/ 18 июня 2019

В Python 2 строки по умолчанию являются ASCII.Вы можете декодировать их и перекодировать их.поддерживаемые кодировки можно найти здесь: https://docs.python.org/2/library/codecs.html#standard-encodings

Вот пример:

a = "my string"  # a is ASCII encoded bytes
b = u"my string"  # b is unicode, not encoded
c = a.decode()  # c is unicode, not encoded, by default decoding ASCII, you can specify otherwise as an argument
d = c.encode('utf-32')  # d is utf-32 encoded bytes
print type(a)  # output: <type 'str'>
print type(b)  # output: <type 'unicode'>
print type(c)  # output: <type 'unicode'>
print type(d)  # output: <type 'str'>

Примечание 1: в Python 3 все несколько иначе.
Примечание 2: Для того, чтобыписать не-ascii литералы в вашем скрипте (то есть, если вы хотите написать a = "☂" как часть вашего кода, в отличие от a просто переменной, содержащей данные, которые вы откуда-то получили), вы должны объявить кодировку вверхняя часть файла, дополнительная информация здесь .А в Python 2 в буквальном коде принимается только небольшое подмножество символов Юникода.(в то время как в памяти вы, конечно, не ограничены).
Примечание 3: Конечно, хотя тип unicode вам не закодирован, внутренне python сохраняет его в кодировке (либо как utf-32, если я не ошибаюсь).Но это внутренняя деталь, которая вообще не должна влиять на ваш код.

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