python 如何将带有变体选择器的 unicode 转换为字符串并正确呈现它
python how to convert unicodes with variation selectors into string and render it properly
在 Python3 中,有没有办法将“0x9f8d0xe0100”和“0x9f8d0xe0101”等 unicode 正确转换为字符串,以便我们可以直观地看到这些变体选择器所造成的差异?
基本表意文字 0x9f8d 是 CJK 中的“龙”。通过可视化,我的意思是在使用适当的字体时在终端、文本文件等中实现最大的可移植性。
谢谢!
这是一种非常奇怪的字符串格式,但如果确实如此,您可以使用正则表达式来解析这些值。如果代码之间没有定界符,则表达式需要先行否定以防止读取“9f8d0”而不是“9f8d”。
- 匹配“0x”
- 匹配一位或多位十六进制数字。
- 不匹配“x”前的数字
re.sub
可以取一个函数进行替换。在这种情况下,使用 base 16 将正则表达式匹配中的十六进制数字字符串转换为整数,然后将其转换为 Unicode 代码点。
import re
for text in ("0x9f8d0xe0100","0x9f8d0xe0101"):
result = re.sub(r'0x([0-9a-f]+)(?!x)',lambda m: chr(int(m.group(1),16)),text)
print(ascii(result),result)
输出:
'\u9f8d\U000e0100' 龍
'\u9f8d\U000e0101' 龍
在 Python3 中,有没有办法将“0x9f8d0xe0100”和“0x9f8d0xe0101”等 unicode 正确转换为字符串,以便我们可以直观地看到这些变体选择器所造成的差异?
基本表意文字 0x9f8d 是 CJK 中的“龙”。通过可视化,我的意思是在使用适当的字体时在终端、文本文件等中实现最大的可移植性。
谢谢!
这是一种非常奇怪的字符串格式,但如果确实如此,您可以使用正则表达式来解析这些值。如果代码之间没有定界符,则表达式需要先行否定以防止读取“9f8d0”而不是“9f8d”。
- 匹配“0x”
- 匹配一位或多位十六进制数字。
- 不匹配“x”前的数字
re.sub
可以取一个函数进行替换。在这种情况下,使用 base 16 将正则表达式匹配中的十六进制数字字符串转换为整数,然后将其转换为 Unicode 代码点。
import re
for text in ("0x9f8d0xe0100","0x9f8d0xe0101"):
result = re.sub(r'0x([0-9a-f]+)(?!x)',lambda m: chr(int(m.group(1),16)),text)
print(ascii(result),result)
输出:
'\u9f8d\U000e0100' 龍
'\u9f8d\U000e0101' 龍