当前位置: 首页 > 面试题库 >

Python如何使用十六进制字符解码unicode

金谭三
2023-03-14
问题内容

我已经从Web爬网脚本中提取了一个字符串,如下所示:

u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91'

我想u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91'用utf-8解码。使用http://ddecode.com/hexdecoder/,我可以看到结果是'【中字】'

我尝试使用以下语法,但失败了。

msg = u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91'
result = msg.decode('utf8')

错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordi
nal not in range(128)

请问如何正确解码字符串?

感谢帮助。


问题答案:

问题所在

msg = u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91'
result = msg.decode('utf8')

是您正在尝试解码Unicode。那真的没有道理。您可以 Unicode编码为某种编码类型,也可以将字节字符串解码 Unicode。

当你做

msg.decode('utf8')

Python
2看到这msg是Unicode。它知道它无法解码Unicode,因此“有帮助”地假定您要msg使用默认的ASCII编解码器进行编码,以便可以使用UTF-8编解码器将该转换的结果解码为Unicode。Python
3的行为更加明智:代码会因以下原因而失败

AttributeError: 'str' object has no attribute 'decode'

kennytm的答案中给出的技术:

msg.encode('latin1').decode('utf-8')

之所以起作用,是因为小于256的Unicode代码点直接对应于Latin1编码中的字符(也称为ISO
8859-1)。

这是一些Python 2代码,说明了这一点:

for i in xrange(256):
    lat = chr(i)
    uni = unichr(i)
    assert lat == uni.encode('latin1')
    assert lat.decode('latin1') == uni

这是等效的Python 3代码:

for i in range(256):
    lat = bytes([i])
    uni = chr(i)
    assert lat == uni.encode('latin1')
    assert lat.decode('latin1') == uni

您可能会发现这篇文章很有帮助:实用Unicode,由SO老手Ned
Batchelder编写。

除非您被迫使用Python 2,否则我强烈建议您切换到Python3。这将大大减少处理Unicode的痛苦。



 类似资料:
  • 问题内容: 我在ex中有整数。16,我正在尝试将此数字转换为十六进制数字。我试图通过使用十六进制函数来实现此目的,但是每当您向十六进制函数提供整数时,它都会返回十六进制数字的字符串表示形式, 有人可以告诉我如何将字符串格式的十六进制数字转换为简单的十六进制数字。 谢谢!! 问题答案:

  • 问题内容: 如何将十进制转换为以下格式的十六进制(至少两位,零填充,没有0x前缀)? 输入: 输出: 输入: 输出: 我尝试过,但似乎它显示了第一个示例,但没有显示第二个示例。 问题答案: 将该功能与格式一起使用。 该部分要求使用至少2位数字,并使用零将其填充到长度,表示小写的十六进制。 的 格式规范的迷你语言 也给你大写十六进制输出,并且可以前缀字段宽度与以包括或前缀(取决于你阉羊使用或作为格式

  • 问题内容: 我编写了一个简单的程序,用于在Java中向串行端口发送和接收数据。我通过回送测试(Rx到Tx)连接串行端口设备。它工作正常。但我无法发送和接收十六进制数据到串行端口和接收串行端口。在我的设备中使用了FT232BL芯片,因此是否需要任何dll或其他库来将十六进制数据发送和接收到串行端口设备。我的代码如下。 问题答案: 十六进制: 十六进制为:

  • 问题内容: 我要提取长十六进制字符串形式的数据,我需要将其转换为十进制表示法,截断18个小数位,然后在JSON中使用。 例如,我可能具有十六进制字符串: 最初我尝试使用,但是由于它支持的最高级别,我的数量最终太大了。 转换和截断后的示例为10 ^ 6。但是,在某些情况下,此数字最多可以为10 ^ 12(意味着截断为10 ^ 30!)。 攻击此问题的最佳策略是什么? 问题答案: 使用math / b

  • 如何在Flutter中将这样的十六进制颜色字符串转换为? 我想在Dart中使用一个十六进制颜色代码。

  • 问题内容: 我正在尝试使用但我得到了 我尝试了很多变体,它们似乎都可以在Python 2.5.2中工作,那么我需要做些什么才能使它们在Python 3.1中工作? 问题答案: 该编解码器已被卡住在3.x中 改为使用: