如何转换字符串,以便每个字符都替换为相应的 Unicode 转义序列?
类似:
def unicode_escape(s):
"""How do I write this?"""
print(unicode_escape("Hello, World!\n"))
# should print \u0048\u0065\u006C\u006C\u006F\u002C\u0020...
ord()
函数返回字符的 Unicode 代码点。只需将其格式化为 \u
,后跟 4 位十六进制表示形式即可。
def unicode_escape(s):
return "".join(map(lambda c: rf"\u{ord(c):04x}", s))
print(unicode_escape("Hello, World!\n"))
# prints \u0048\u0065\u006c\u006c\u006f\u002c\u0020\u0057\u006f\u0072\u006c\u0064\u0021\u000a
def encode(s):
ret = []
for c in s:
n = ord(c)
ret.append("\\u{:04x}".format(n))
return "".join(ret)
#
print(encode("aeiouäöüßéá€æÆΑαΒβΓγ"))
现有的两个答案并不完全错误,但它们不适用于 0x10000 到 0x10FFFF 的字符;例如,
\u10000
将被解析为字符串中的 \u1000
,后跟 0
。
应相应添加条件检查;根据个人喜好,您可能还希望将 0xFF 及以下使用
\x
而不是 \u
:
def convert_to_unicode_escape_sequence(char: str) -> str:
char_code = ord(char)
if char_code <= 0xFF:
return fr'\x{char_code:02x}'
if char_code <= 0xFFFF:
return fr'\u{char_code:04x}'
return fr'\U{char_code:08x}'
convert_to_unicode_escape_sequence('\x00') # '\\x00'
convert_to_unicode_escape_sequence('\x61') # '\\x61'
convert_to_unicode_escape_sequence('\u0100') # '\\u0100'
convert_to_unicode_escape_sequence('\U00010000') # '\\U0001000'
ascii()
可能会派上用场:
ascii('\x00') # "'\\x00'"
ascii('\u0100') # "'\\u0100'"
ascii('\U00010000') # "'\\x00'"
返回的值是一个字符串,包含两个单引号、一个反斜杠、一个
x
/u
/U
以及相应的十六进制数字。请注意,ascii()
不会将字符从 0x20(空格)转换为 0x7E(波浪线):
ascii('a') # "'a'"
这有点无关紧要,但反斜杠(0x5C)得到特殊处理:
ascii('\\') # "'\\\\'"
考虑到这一点,新的实现将如下所示:
def convert_to_unicode_escape_sequence(char):
if ' ' <= char <= '~':
return fr'\x{char_code:02x}'
return ascii(char)[1:-1] # Strip the quotes
不过,这看起来很像黑客。