Python Unicode十六进制字符串解码

时间:2014-11-01 09:04:40

标签: python string python-2.7 unicode hex

我有以下字符串:在windows-1255中编码的u'\ xe4 \ xe7 \ xec \ xf7 \ xe4 \ xf9 \ xec \ xe9 \ xf9 \ xe9'我想将其解码为Unicode代码点(u' \ u05d4 \ u05d7 \ u05dc \ u05e7 \ u05d4 \ u05e9 \ u05dc \ u05d9 \ u05e9 \ u05d9')。

>>> u'\xe4\xe7\xec\xf7 \xe4\xf9\xec\xe9\xf9\xe9'.decode('windows-1255')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\cp1255.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

但是,如果我尝试解码字符串:'\ xe4 \ xe7 \ xec \ xf7 \ xe4 \ xf9 \ xec \ xe9 \ xf9 \ xe9'我没有得到例外:

>>> '\xe4\xe7\xec\xf7 \xe4\xf9\xec\xe9\xf9\xe9'.decode('windows-1255')
u'\u05d4\u05d7\u05dc\u05e7 \u05d4\u05e9\u05dc\u05d9\u05e9\u05d9'

如何解码Unicode十六进制字符串(获取异常的字符串)或将其转换为可解码的常规字符串?

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

那是因为\xe4\xe7\xec\xf7 \xe4\xf9\xec\xe9\xf9\xe9是一个字节数组,而不是Unicode字符串:字节代表有效的windows-1255个字符而不是有效的Unicode code points

因此,在使用u进行前置时,Python解释器无法解码字符串,甚至无法打印它:

>>> print u'\xe4\xe7\xec\xf7 \xe4\xf9\xec\xe9\xf9\xe9'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

因此,为了将您的字节数组转换为UTF-8,您必须将其解码为windows-1255,然后将其编码为utf-8

>>> '\xe4\xe7\xec\xf7 \xe4\xf9\xec\xe9\xf9\xe9'.decode('windows-1255')
                                               .encode('utf8')
'\xd7\x94\xd7\x97\xd7\x9c\xd7\xa7 \xd7\x94\xd7\xa9\xd7\x9c\xd7\x99\xd7\xa9\xd7\x99'

这给出了原始的希伯来文:

>>> print '\xd7\x94\xd7\x97\xd7\x9c\xd7\xa7 \xd7\x94\xd7\xa9\xd7\x9c\xd7\x99\xd7\xa9\xd7\x99'
החלק השלישי

答案 1 :(得分:3)

  

我有以下字符串:u'\xe4\xe7\xec\xf7 \xe4\xf9\xec\xe9\xf9\xe9'编码windows-1255

这是自相矛盾的。 u表示它是Unicode字符串。但是如果你说它是以任何形式编码的,它必须是一个字节串(因为Unicode字符串只能编码成一个字节串)。

确实 - 你的给定实体 - \xe4\xe7等 - 每个都代表一个字节,只有通过给定的编码windows-1255才能给出它们各自的含义。

换句话说,如果您有u'\xe4',则可以确定它与u'\u00e4'相同,而不是u'\u05d4',否则就是这样。

如果您从一个不知道此问题的来源获得错误的Unicode字符串,您可以从中获得您真正需要的字节字符串:借助于“1:1编码”,是latin1。

所以

correct_str = u_str.encode("latin1")
# now every byte of the correct_str corresponds to the respective code point in the 0x80..0xFF range
correct_u_str = correct_str.decode("windows-1255")

答案 2 :(得分:1)

试试这个

>> u'\xe4\xe7\xec\xf7 \xe4\xf9\xec\xe9\xf9\xe9'.encode('latin-1').decode('windows-1255')
u'\u05d4\u05d7\u05dc\u05e7 \u05d4\u05e9\u05dc\u05d9\u05e9\u05d9'

答案 3 :(得分:-1)

像这样解码,

 >>> b'\xe4\xe7\xec\xf7 \xe4\xf9\xec\xe9\xf9\xe9'.decode('windows-1255')
    u'\u05d4\u05d7\u05dc\u05e7 \u05d4\u05e9\u05dc\u05d9\u05e9\u05d9'