在python中将字符串转换为unicode类型

时间:2013-10-08 21:24:20

标签: python unicode encoding utf-8

我正在尝试这段代码:

s = "سلام"
'{:b}'.format(int(s.encode('utf-8').encode('hex'), 16))

但发生此错误:

'{:b}'.format(int(s.encode('utf-8').encode('hex'), 16))
     

UnicodeDecodeError:'ascii'编解码器无法解码位置0的字节0xd3:序号不在范围内(128)

我试过了'{:b}'.format(int(s.encode('utf-8').encode('hex'), 16))但没有改变。

我该怎么办?

1 个答案:

答案 0 :(得分:7)

由于你使用的是python 2,s = "سلام"是一个字节字符串(无论你的终端使用什么编码,大概是utf8):

>>> s = "سلام"
>>> s
'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'

您不能encode字节字符串(因为它们已经“编码”)。你正在寻找unicode(“真实”)字符串,在python2中必须以u为前缀:

>>> s = u"سلام"
>>> s
u'\u0633\u0644\u0627\u0645'
>>> '{:b}'.format(int(s.encode('utf-8').encode('hex'), 16))
'1101100010110011110110011000010011011000101001111101100110000101'

如果您从raw_input等函数获取字节字符串,那么您的字符串已经编码 - 只需跳过encode部分:

'{:b}'.format(int(s.encode('hex'), 16))

或(如果您要对其进行任何其他操作)将其转换为unicode:

s = s.decode('utf8')

这假设您的输入是UTF-8编码,如果情况可能不是这样,请先检查sys.stdin.encoding

i10n的内容很复杂,这里有两篇文章可以帮助你进一步: