Python:将 Unicode-Hex-String 转换为 Unicode

Posted

技术标签:

【中文标题】Python:将 Unicode-Hex-String 转换为 Unicode【英文标题】:Python: Convert Unicode-Hex-String to Unicode 【发布时间】:2011-10-10 00:54:45 【问题描述】:

我有一个由具有该功能的 unicode 字符串组成的十六进制字符串:

def toHex(s):
    res = ""
    for c in s:
        res += "%02X" % ord(c) #at least 2 hex digits, can be more
    return res

hex_str = toHex(u"...")

这会返回一个类似这样的字符串:

"80547CFB4EBA5DF15B585728"

这是一个由 6 个中国符号组成的序列。 但是

u"Knödel"

转换为

"4B6EF664656C"

我现在需要一个将其转换回原始 unicode 的函数。中文符号似乎具有 2 字节表示,而第二个示例具有所有字符的 1 字节表示。所以我不能只对每个 1 或 2 字节块使用 unichr()。

我已经试过了

binascii.unhexlify(hex_str)

但这似乎是逐字节转换并返回一个字符串,而不是 unicode。我也试过了

binascii.unhexlify(hex_str).decode(...)

具有不同的格式。从来没有得到原始的 unicode 字符串。

非常感谢您!

【问题讨论】:

【参考方案1】:

这似乎工作得很好:

binascii.unhexlify(binascii.hexlify(u"Knödel".encode('utf-8'))).decode('utf-8')

回到原来的对象。如果中文文本编码正确,你可以对它做同样的事情,但是ord(x) 已经破坏了你开始的文本。您需要先对其进行编码,然后才能将其视为一串字节。

【讨论】:

感谢您的回答!我的问题是,我从第 3 方软件获得了十六进制字符串,因此我对编码没有影响...... 然后问他们是什么编码。否则无法正确解码... 另外,文本似乎是 utf-16。 binascii.unhexlify("80547CFB4EBA5DF15B585728").decode('utf-16') 似乎返回了亚洲的东西(虽然无法验证) 非常感谢!它似乎真的是大端字节序的 UTF-16! (codecs.BOM_UTF16_BE + binascii.unhexlify("80547CFB4EBA5DF15B585728")).decode('utf-16') 似乎做对了。再次感谢您的所有回答!【参考方案2】:

做不到。使用%02X 会丢失太多信息。您应该首先使用 UTF-8 之类的东西并对其进行转换,而不是发明一种损坏的编码。

>>> u"Knödel".encode('utf-8').encode('hex')
'4b6ec3b664656c'

【讨论】:

感谢您的回答!我的问题是,我从第 3 方软件获得十六进制字符串,因此我对编码没有影响......所以你的意思是,没有办法确定“80547CFB4EBA5DF15B585728”是什么意思? 没错。除非您同意一致的协议,否则代码给出的暴力编码不是。 @Robert:如果它是用已知编码制作的,你可以得到文本,例如UTF-8 或 UTF-16。【参考方案3】:

不久前,当我在 VB 应用程序中使用 Unicode 时,如果前 1 或 2 位数字为“0”,则它们将被删除。意思是“&H00A2”将自动转换为“&HA2”,我刚刚创建了一个小函数来检查字符串的长度,如果它小于 4 个字符,则添加缺少的 0。我不确定这是否是发生在你身上的事情,但我想我会提供一些信息作为要注意的事情。

【讨论】:

以上是关于Python:将 Unicode-Hex-String 转换为 Unicode的主要内容,如果未能解决你的问题,请参考以下文章

怎么将python中的数组全部打印出来array

python如何将字符转换为数字

python 将一个List分解

如何将python三个方法输出在同一行

在python中,如何将一个字符串中的小写字母全部转换为大写?

python中,如何将字符串中的多个不等量空格改为改为逗号分隔?