2012-02-24 5 views
1

В моей программе я получаю коды символов shift-jis как целые числа Python, которые мне нужно преобразовать в соответствующие коды символов utf8 (которые также должны быть в целых числах). Как я могу это сделать? Для ASCII у вас есть полезные функции ord()/chr(), которые позволяют вам преобразовать целое число в строку ASCII, которую вы можете легко преобразовать в unicode позже. Я не могу найти ничего подобного для других кодировок.получить код символа utf-8 с учетом кода символа shift-jis?

Использование Python 2.

EDIT: окончательный код. Спасибо всем:

def shift_jis2unicode(charcode): # charcode is an integer 
    if charcode <= 0xFF: 
     string = chr(charcode) 
    else: 
     string = chr(charcode >> 8) + chr(charcode & 0xFF) 

    return ord(string.decode('shift-jis')) 

print shift_jis2unicode(8140) 
+0

Это необычно, чтобы получить их в виде целых чисел, а не байт - это то, что что-то ты можешь измениться? –

+0

Извините, я не могу. BTW, я думаю, что «байты» - это что-то новое в Python 3, я использую 2. –

+0

Python 2 'str' работает как байты, и имеет псевдоним' bytes' в 2.6 и 2.7. –

ответ

2

Нет такой вещи, как «коды символов utf8 (которые также должны быть целыми)».

Юникод определяет «кодовые точки», которые являются целыми числами. UTF-8 определяет, как преобразовать эти кодовые точки в массив байтов.

So I думаю вы хотите, чтобы кодовые обозначения Юникода. В этом случае:

def shift_jis2unicode(charcode): # charcode is an integer 
    if charcode <= 0xFF: 
     shift_jis_string = chr(charcode) 
    else: 
     shift_jis_string = chr(charcode >> 8) + chr(charcode & 0xFF) 

    unicode_string = shift_jis_string.decode('shift-jis') 

    assert len(unicode_string) == 1 
    return ord(unicode_string) 

print "U+%04X" % shift_jis2unicode(0x8144) 
print "U+%04X" % shift_jis2unicode(0x51) 

(также: Я не думаю, что 8100 является допустимым кодом символа Shift-JIS ...)

+0

8100 был своего рода догадкой и неправильным. Не получите весь unicode vs utf-8. Я думаю, что ты прав. –

+0

@AlexC, строки Unicode состоят из кодовых точек (обычно один на символ), а 'ord' преобразует кодовую точку в целое число. UTF-8 является представлением кодовой точки в 1 или более 8-битных байтах. –

+0

Извините, "codepoint"? –

1

Может быть, лучший способ сделать это, но так как других ответов пока нет, это вариант.

Вы можете использовать this table для преобразования Shift-JIS целых к точкам Юникода кода, а затем использовать unichr() для преобразования данных в объект Юникод Python, а затем преобразовать его из юникода в utf8 с помощью unicode.encode('utf-8').

+0

Спасибо. Я уже использую пользовательскую таблицу. Я думал, что если я смогу использовать то, что предоставляет Python, код будет более чистым, и мне не нужно будет иметь дополнительный файл, содержащий все коды символов. –

0
def from_shift_jis(seq): 
    chars = [chr(c) if c <= 0xff else chr(c>>8) + chr(c&0xff) for c in seq] 
    return ''.join(chars).decode('shift-jis') 

utf8_output = [ord(c) for c in from_shift_jis(shift_jis_input).encode('utf-8')] 
+0

Что делает «chr (c >> 8) + chr (c & 0xff)»? –

+0

@AlexC, 'c >> 8 сдвигает верхние 8 бит целого числа на нижние 8 бит, а' c & 0xff' удаляет верхние 8 бит. Это способ разделения целого на две 8-битные части. 'Chr' преобразуется в символ, как вы знаете, и' + 'присоединяет их к двухсимвольной строке. –

+0

OK. У меня теперь возникают проблемы с преобразованием строки unicode в целое число символов символа utf-8. Я обновлю свой вопрос кодом, который у меня есть, пожалуйста, посмотрите. –