【问题标题】:Convert UTF-8 octets to unicode code points将 UTF-8 八位字节转换为 unicode 代码点
【发布时间】:2010-12-24 07:06:23
【问题描述】:

我有一组 UTF-8 八位字节,我需要将它们转换回 unicode 代码点。我如何在 python 中做到这一点。

例如UTF-8 八位字节 ['0xc5','0x81'] 应转换为 0x141 代码点。

【问题讨论】:

  • 你是 100% 的吗?我能否请教一个非常愚蠢的问题:您到底是如何设法获取这种格式的数据的?
  • 您是在尝试转换为代码点还是“Python”Unicode 字符串?这是相当大的区别,因为 Python Unicode 字符串包含 UTF-16,并且一个代码点可能用两个“字符”编码——代理对。注意你想要什么。接受的答案不会给你代码点,而是 UTF-16 编码的字符串。
  • 我从一个转换函数中得到了值,该函数将我们的内部编码转换为 utf-8,反之亦然。
  • @Artyom:我想将 utf-8 转换为 unicode 代码点。那么如何获取 unicode 代码点而不是 python unicode 字符串

标签: python unicode utf-8


【解决方案1】:

Python 3.x:

在 Python 3.x 中,str 是用于 Unicode 文本的类,bytes 用于包含八位字节。

如果您所说的“八位字节”真的是指 '0xc5' 形式的字符串(而不是 '\xc5'),您可以像这样转换为 bytes:

>>> bytes(int(x,0) for x in ['0xc5', '0x81'])
b'\xc5\x81'

然后您可以使用str 构造函数转换为str(即:Unicode)...

>>> str(b'\xc5\x81', 'utf-8')
'Ł'

...或通过在bytes 对象上调用.decode('utf-8'):

>>> b'\xc5\x81'.decode('utf-8')
'Ł'
>>> hex(ord('Ł'))
'0x141'

3.x 之前的版本:

在 3.x 之前,str 类型是字节数组,unicode 用于 Unicode 文本。

同样,如果“八位位组”的真正意思是 '0xc5' 形式的字符串(而不是 '\xc5'),你可以像这样转换它们:

>>> ''.join(chr(int(x,0)) for x in ['0xc5', '0x81'])
'\xc5\x81'

然后您可以使用构造函数转换为unicode...

>>> unicode('\xc5\x81', 'utf-8')
u'\u0141'

...或通过在str 上调用.decode('utf-8'):

>>> '\xc5\x81'.decode('utf-8')
u'\u0141'

【讨论】:

  • +1:另外,int(x,0) 具有允许混合基本八位字节字符串的优点,例如,['0xc5', '0x81', '0305', '0201'] 是相同的十六进制和八进制表示。 int(x,16) 会误解此输入中的八进制字符串
  • @mhawke:要检测错误,可以使用int(x, 16):bytearray(int(x, 16) for x in ['0xc5', '0x81']).decode('utf-8', 'surrogatepass')(单源 Python 2/3 代码)
  • @thang 答案最初是为 pre-3.x 编写的。 3.x 中不再有unicode——现在是str。我已将答案更新为 2.x 和 3.x 版本。
【解决方案2】:

在可爱的 3.x 中,所有 strs 都是 Unicode,而 bytes 是 strs 过去的样子:

>>> s = str(bytes([0xc5, 0x81]), 'utf-8')
>>> s
'Ł'
>>> ord(s)
321
>>> hex(ord(s))
'0x141'

这是你要求的。

【讨论】:

  • 您可以使用适用于 Python 2 和 3 的bytearray([0xc5, 0x81]).decode('utf-8')。
【解决方案3】:
l = ['0xc5','0x81']
s = ''.join([chr(int(c, 16)) for c in l]).decode('utf8')
s
>>> u'\u0141'

【讨论】:

    【解决方案4】:
    >>> "".join((chr(int(x,16)) for x in ['0xc5','0x81'])).decode("utf8")
    u'\u0141'
    

    【讨论】:

      猜你喜欢
      • 2012-06-20
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2013-03-23
      • 2011-12-05
      • 2015-10-08
      • 2011-06-05
      相关资源
      最近更新 更多