Нет такой вещи как "коды символов 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 ...)