python - 如何从 Python 3 中的 UTF-16 代码点获取字符?
问题描述
我有一个 UTF-16 代码点列表,我需要将其转换为它们以编程方式表示的实际字符。这在 Python 3 中似乎很难做到。
例如,我有一个字符的数字 55357 和 56501,我知道这是钞票表情符号:但我不知道如何在 Python 中转换它。我第一次尝试chr(55357) + chr(56501)
,但 Python 似乎假设它是 UTF-8 编码的,因此给了我破碎的 Unicode。
然后我尝试重新编码该字符串,但由于它已损坏 UTF-8,它给了我似乎已损坏的 UTF-16。如果我告诉它不要管它(chr(55357) + chr(56501)).encode('utf-8', 'surrogatepass')
,我实际上可以获得字符的有效字节,但它被编码在... CESU-8 中,原因我还不能理解。这不是 Python 原生支持的编码,我找不到可以转换它的编解码器。
我想我可以将这些写入磁盘,然后用正确的编码读取它们,但这听起来真的很糟糕。
在 Python 3 中是否有合理的方法来做到这一点?
解决方案
诀窍不是弄乱,chr
而是转换为字节数组,然后您可以将其解码为字符串:
a, b = 55357, 56501
x = a.to_bytes(2, 'little') + b.to_bytes(2, 'little')
print(x.decode('UTF-16'))
这可以推广到任意数量的整数:
data = [55357, 56501]
b = bytes([x for c in data for x in c.to_bytes(2, 'little')])
result = b.decode('utf-16')
类似的东西chr(55357) + chr(56501)
不起作用的原因是chr
假设没有编码。它适用于原始 Unicode 代码点,因此您正在组合两个不同的字符。正如另一个答案指出的那样,您必须对这两个字符串进行编码并重新解码,或者按照我的建议只获取字节并解码一次。
推荐阅读
- python - 如何在 JSON 中搜索关键字
- javascript - 如何通过转换为 Uint8Array 保留源 Int16Array 值
- java - 运行与 Android 应用程序并行的可执行 JAR 文件
- javascript - 如何在脚本的同一行中获取多个单元格的范围
- java - 运行 Java 程序返回 sun.awt.X11GraphicsEnvironment 错误或 HeadlessException
- javascript - 正则表达式排除重音
- javascript - 如何在不触及引号内的单词和字母的情况下替换字符串中的特定字母
- reactjs - React - 如何将字体大小添加到 React.createElement 中?
- c# - 如果我们尝试更新的资源没有影响任何行,我们是否应该抛出异常?
- javascript -
标签在附加的textarea jQuery中不起作用