在 Python 中将字符串转换为 Unicode 类型



我正在尝试以下代码:

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))但没有任何改变。

我该怎么办?

由于您使用的是python 2,因此s = "سلام"是一个字节字符串(无论您的终端使用哪种编码,大概是utf8(:

>>> s = "سلام"
>>> s
'xd8xb3xd9x84xd8xa7xd9x85'

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

>>> s = u"سلام"
>>> s
u'u0633u0644u0627u0645'
>>> '{: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的东西很复杂,这里有两篇文章可以进一步帮助你:

  • 每个软件开发人员绝对、肯定地必须了解 Unicode 和字符集的绝对最低限度

  • 每个程序员绝对需要了解的关于编码和字符集以处理文本

  • 的内容

最新更新