将字符串转换为 unicode 转义序列

问题描述 投票:0回答:3

如何转换字符串,以便每个字符都替换为相应的 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...
python string unicode escaping
3个回答
3
投票

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

0
投票
def encode(s):
    ret = []
    for c in s:
        n = ord(c)
        ret.append("\\u{:04x}".format(n))
    return "".join(ret)
#


print(encode("aeiouäöüßéá€æÆΑαΒβΓγ"))

0
投票

现有的两个答案并不完全错误,但它们不适用于 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

不过,这看起来很像黑客。

© www.soinside.com 2019 - 2024. All rights reserved.