2015-12-09 2 views
0

У меня есть две переменных (скажем, x и y), которые имеют следующие значения:Как сравнить unicode и строку в Python?

x = u'Ko\u0161ick\xfd' 
y = 'Ko\x9aick\xfd' 

Они предположительные кодирующее же имя, но по-другому. Первая переменная является юникодом, а вторая - строкой.

Есть ли способ преобразовать строку в unicode (или unicode в строку) и проверить, действительно ли они одинаковы.

Я пытаюсь использовать encode

x.encode('utf-8') 

Он возвращает что-то новое (третья версия):

'Ko\xc5\xa1ick\xc3\xbd' 

и используя следующее:

print x.encode('utf-8') 

возвращается еще одна версия:

KošickÛ 

Итак, я совершенно смущен. Есть ли способ сохранить все в одном формате?

+0

ваш 'y' отсутствует что-то ... Я проверил его на моем отладчике IDLE python, а' x' - 'Kosicky' и' y' is 'Koicky' (отсутствует 's'). – Neoares

+0

@Neoares Ваш IDLE, похоже, не имеет правильных глифов. 'x' является« Košický »здесь. – tripleee

+0

@tripleee, тогда это нормально :) Во всяком случае, какой IDLE вы используете? – Neoares

ответ

2

Вы можете преобразовать строку байтов в Юникод, но если в ней содержатся любые символы, отличные от ASCII, вы должны указать кодировку.

if y.decode('iso-8859-1') == x: 
    print(u'{0!r} converted to Unicode == {1}".format(y, x)) 

С данным примером, это неправда; но, возможно, y находится в другом кодировании.

В теории вы можете конвертировать любой способ, но, как правило, имеет смысл использовать все Unicode внутри и преобразовывать другие кодировки в Unicode для использования в вашем коде (а не наоборот).

0

Ну, utf-8 теперь является стандартом де-факто для обмена и в мире Linux, но есть и множество других кодировок.

Общие примеры: latin1, latin9 (то же самое с символом €), и cp1252 - их вариант с окнами.

В вашем случае:

>>> x.encode('cp1252') 
'Ko\x9aick\xfd' 

Так что y строки, кажется, cp1252 закодирован.

1

Вам необходимо знать кодировку строки байта. Похоже windows-1252:

x = u'Ko\u0161ick\xfd' 
y = 'Ko\x9aick\xfd' 

print x == y.decode('windows-1252') 
print x.encode('windows-1252') == y 

Выход:

True 
True 

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