最简单的方法是这样的:
i=0x0222
print(f'{chr(i)}')
在fstring中替换"\u"前缀的数据部分是不行的,因为\uXXXX模式被认为是一个单个字符:Python将尝试将{
解析为其中之一的“X”,并引发SyntaxError,因为它不是十六进制数字。
话虽如此,还有其他编写该替换的方式,以便您可以通过数字进行内联动态unicode代码点编码。其中一种方式是直接使用"unicodeescape"编解码器-但您的字符串必须先转换为字节:
i = "0222"
f"\\u{i}".encode("ASCII", errors="backslashreplace").decode("unicode_escape")
所以 - 我们在这里做了三件事情:首先,"double \" 转义了实际的斜杠并在第一个字符串中产生了两个字符:" " 和 "u" 字符 - 不像 "\u" 是一个序列,它将指示解析器需要四个十六进制数字跟随。
之后,在 fstring 中的 {i} 将按预期工作:4 个数字只是在那里呈现。
然后,使用限制为 "ASCII" 编解码器将生成的字符串转换为字节对象,但告诉它将不能表示为 ASCII 的任何字符转换为反斜杠序列在最终的字节字符串中。这种转换不会影响
\u0222
序列本身,但它将确保文本中可能存在的任何其他 Unicode 字符都将被保留并允许往返传输。
对字节对象调用 ".decode",并且将在程序运行时(而不是在源代码解析时)"手动"执行您一开始尝试的 "\u" 替换。此代码将 "看到" \u0222
序列并产生所需的 Ȣ
字符。
由于这样写很麻烦,您可以创建一个实用函数:
def r(text, character_codes):
return (text.format(**character_codes)
.encode("ASCII", errors="backslashreplace")
.decode("unicode_escape")
)
...
i = "0222"
text = r("\\u{i}", locals())
print(f"{chr(int(i, 16))}")
- Bijay Regmi