Python 获取给定shift jis字符代码的utf-8字符代码?

Python 获取给定shift jis字符代码的utf-8字符代码?,python,encoding,utf-8,shift-jis,Python,Encoding,Utf 8,Shift Jis,在我的程序中,我将shift jis字符代码转换为Python整数,我需要将其转换为相应的utf8字符代码(也应该是整数)。 我该怎么做? 对于ASCII,您可以使用有用的函数ord()/chr(),该函数允许您将整数转换为ASCII字符串,以后可以轻松地将其转换为unicode。对于其他编码,我找不到类似的东西 使用Python 2 编辑:最终代码。谢谢大家: def shift_jis2unicode(charcode): # charcode is an integer if ch

在我的程序中,我将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)
def shift_jis2unicode(charcode):#charcode是一个整数
如果charcode>8)+chr(charcode&0xFF)
返回ord(字符串解码('shift-jis'))
打印shift_jis2unicode(8140)

也许有更好的方法,但由于没有其他答案,这里有一个选择

您可以使用将shift jis整数转换为unicode代码点,然后使用将数据转换为Python unicode对象,然后使用将其从unicode转换为utf8。

def from_shift_jis(seq):
字符=[c>8时的chr(c)+序列中c的chr(c&0xff)]
返回“”。加入(字符)。解码('shift-jis')
utf8_输出=[c的ord(c)表示从shift_jis(shift_jis_输入)输入的c。编码('utf-8')]
没有“utf8字符代码(也应该是整数)”这样的东西

Unicode定义了“代码点”,即整数。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)
def shift_jis2unicode(charcode):#charcode是一个整数
如果charcode>8)+chr(charcode&0xFF)
unicode\u string=shift\u jis\u string.decode('shift-jis')
断言len(unicode_字符串)==1
返回ord(unicode_字符串)
打印“U+%04X”%shift\U jis2unicode(0x8144)
打印“U+%04X”%shift\U jis2unicode(0x51)

(另外:我不认为8100是一个有效的shift JIS字符代码…

将它们作为整数而不是字节获取是不寻常的-这是可以更改的吗?抱歉,我不能。顺便说一句,我认为“bytes”在Python3中是新的,我使用了2。Python2
str
与bytes类似,它在2.6和2.7中有一个
bytes
别名。显示一些示例数据,让我们更好地了解您正在使用的是什么。“str”是一种内置类型。“字符串”是一个内置模块。从技术上讲,您可以将它们用于变量名,但这很容易混淆。最好避开它们。谢谢。我已经在使用自定义表了。我想如果我能使用Python提供的东西,代码会更干净,我不需要一个额外的文件来保存所有字符代码。“chr(c>>8)+chr(c&0xff)”有什么作用?@AlexC,
c>>8
将整数的上8位移到下8位,然后
c&0xff
去掉上8位。这是一种将整数拆分为两个8位部分的方法。
chr
转换为您知道的字符,
+
将它们附加到一个两个字符的字符串中。OK。我现在很难将unicode字符串转换为utf-8字符的整数。我将用我目前掌握的代码更新我的问题,请看一看。@AlexC,我认为您希望测试代码中包含
0x8100
,而不是
8100
。我认为0xFF和255在Python中是完全相同的。不管怎么说,还是个错误。8100是一种猜测,也是一个错误的猜测。不要把整个unicode与utf-8业务联系起来。不过我认为你是对的。@AlexC,Unicode字符串由码点组成(通常每个字符一个),而
ord
将码点转换为整数。UTF-8是一个以1个或更多8位字节表示的代码点。为了更好地介绍Unicode和所有编码问题,我建议“每个软件开发人员绝对、绝对必须了解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)