получить код символа utf-8 с учетом кода символа shift-jis? - PullRequest
1 голос
/ 24 февраля 2012

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

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

РЕДАКТИРОВАТЬ: окончательный код.Спасибо всем:

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)

Ответы [ 3 ]

2 голосов
/ 25 февраля 2012

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

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

Так что я думаю , что вам нужны кодовые точки Unicode. В этом случае:

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 ...)

1 голос
/ 24 февраля 2012

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

Вы можете использовать эту таблицу для преобразования ваших целых чисел shift-jis в кодовые точки Юникода, затем использовать unichr() для преобразования ваших данных в объект Unicode Python, а затем преобразовать от юникода до utf8, используя unicode.encode('utf-8').

0 голосов
/ 24 февраля 2012
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')]
...