2015-01-17 5 views
0
test = unicode('\x03B', 'utf-16BE', 'ignore') 

Производит тарабарщину. Я бы хотел, чтобы тест был точкой с запятой. Если я заменил hex на '\x03~', я получу точку с запятой.Производить unicode obj из строки в python?

Мой вопрос: почему? Я думал, что значение unicode точки с запятой было 003B?

Спасибо!

ответ

1

Существует более одного символа, который похож на точку с запятой. Поскольку вы упомянули '\x03~' и кодировку utf-16be, вы должны иметь в виду GREEK QUESTION MARK. (Ниже я буду обозначать '\x03~' как b'\x03~' сделать этот ответ правильный в обоих python2.7 и Python3.)

In [207]: b'\x03~'.decode('utf-16be') 
Out[207]: u'\u037e' 

In [208]: import unicodedata as UDAT 

In [209]: UDAT.name(u'\u037e') 
Out[209]: 'GREEK QUESTION MARK' 

In [206]: u'\N{GREEK QUESTION MARK}' == u';' 
Out[206]: True 

In [198]: u'\N{GREEK QUESTION MARK}'.encode('utf-16be') 
Out[198]: b'\x03~' 

Таким образом, юникода U + 037E (ГРЕЧЕСКИЙ вопросительный знак), закодированные в UTF-16BE есть b'\x03~', а не b'\x03'.


Обратите внимание, что это не то же самое, как U + 003B (SEMICOLON):

In [211]: u';'.encode('utf-16be') 
Out[211]: b'\x00;' 

In [212]: UDAT.name(u';') 
Out[212]: 'SEMICOLON' 

In [214]: hex(ord(u';')) 
Out[214]: '0x3b' 

In [216]: u'\u003b' == u'\N{SEMICOLON}' 
Out[216]: True 

In [217]: u'\N{GREEK QUESTION MARK}' == u'\N{SEMICOLON}' 
Out[217]: False 
1

Вы не смогли правильно указать точку с запятой, кодированную UTF-16, которая состоит из двух октетов, \x00 и \x3B. Правильная инструкция:

test = unicode('\x00\x3B', 'utf-16BE', 'ignore') 

Это дает точку с запятой в Юникоде, как и ожидалось.

Смежные вопросы