Unicode строка Python - PullRequest
       1

Unicode строка Python

2 голосов
/ 25 ноября 2011

Мне нужно записать в файл строку, содержащую знак степени (°).

Эта строка хранится в переменной и, как и ожидалось, когда я пытаюсь: f.write(myVariable.encode('utf-8')) Я получаю UnicodeDecodeError.

Если я попытаюсь записать эту строку в файл, подобный:

x = u'aaa°°bbb'
f.write(encode(x))

работает нормально, но я не могу написать x = u'aaa°°bbb' в своем коде, потому что 'aaa°°bbb' происходит из базы данных и хранится в переменной, и если я пытаюсь newVar = unicode(myVariable), я получаю UnicodeDecodeError.

Мне нужно передать myVariable оператору Python 'u' ... Как я могу это сделать?

Ответы [ 5 ]

2 голосов
/ 25 ноября 2011

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

s.decode('latin1')

Конечно, если она изначально неправильно закодирована в базе данных, вам нужно будет как-то компенсировать.

s.encode('latin1').decode('utf8')
1 голос
/ 25 ноября 2011

Если myVariable - это строка, полученная из внешнего источника (например, базы данных), вам сначала нужно выяснить, что это за вид строки.

Так как вам кажется,чтобы использовать python2, есть две основные возможности: myVariable - это либо Unicode строковый объект, либо байтов строковый объект.Строка Unicode - это строка, которая уже была декодирована в текстовые символы.Строка байтов - это строка, которая уже была закодирована (используется кодировка типа 'utf-8' или 'latin-1').

Из примера кода в вашем вопросе видно, чтоmyVariable - это байт строковый объект.

Причина, по которой вы получаете первый UnicodeDecodeError, заключается в том, что вы пытаетесь re -кодировать строку байта.Чтобы сделать это, Python должен сначала декодировать myVariable к строковому объекту Unicode, прежде чем он сможет применить новую кодировку.По умолчанию python предполагает кодировку "ascii" при автоматическом декодировании таким способом, но поскольку myVariable содержит байты за пределами диапазона ascii (0-128), возникает ошибка.

Такая же ситуация возникает, когда выпопробуйте передать myVariable в функцию unicode.Если не указано явное кодирование, python снова примет «ascii», и вы увидите то же самое UnicodeDecodeError.

Теперь, когда дело доходит до записи myVariable в файл, решение очень простоеесли это объект строки байтов: ничего не делать!Просто напишите myVariable непосредственно в файл:

f = open(path, 'wb')
f.write(myVariable)
f.close()

Однако, когда вы читаете файл обратно, вам потребуется , чтобы узнать исходную кодировку myVariable, чтобы декодироватьэто в Unicode:

f = open(path)
myVariable = f.read().decode('utf-8')
f.close()

И теперь, если вы измените myVariable и хотите снова записать его обратно в файл, вы должны помнить, что на этот раз это строка Unicode и вам нужно сначала его кодировать:

f = open(path, 'wb')
f.write(myVariable.encode('utf-8'))
f.close()
1 голос
/ 25 ноября 2011

В зависимости от того, используется ли myVariable в формате Юникод или в байтах (разные имена в py2 и py3), вам придется принять решение о преобразовании.

Поскольку newVar = unicode(myVariable) не удается декодировать, вы, вероятно, в байтовом формате (str() в py2). Поэтому вам нужно либо убедить вашу базу данных общаться с вами в Unicode, либо вы должны знать кодировку и декодировать ее в соответствии с этим.

0 голосов
/ 25 ноября 2011

убедитесь, что у вас есть # -*- coding: utf-8 -*- в верхней части вашего файла Python.Он должен кодировать без шва

0 голосов
/ 25 ноября 2011

Откройте файл в виде текста, используя codecs.open() с кодировкой UTF-8, и введите строку Unicode без ручного кодирования, это проще и код выглядит лучше.

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