Unicode表示为格式化的Unicode?

2024-09-27 00:14:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在理解unicode表达式到它们各自的字符的翻译时遇到了一些困难。我一直在研究unicode规范,遇到了各种格式的字符串U+1F600。据我所见,似乎没有一个内置函数知道如何将这些字符串转换为Python的正确格式,例如\U0001F600。在

在我的程序中,我做了一个小正则表达式,它将找到这些U\+.{5}模式,并将U+替换为\U000。但是,我发现这种语法对于所有unicode字符都是不一样的,例如实际上应该从U+200D转换为\u200D的零宽度联接。在

因为我不知道正确的unicode转义序列的每个变体,所以处理这种情况的最佳方法是什么?是因为这些特殊字符的数量有限,我只能检查一下,还是说我完全走错了路?在

Python版本是2.7。


Tags: 函数字符串程序规范宽度表达式格式unicode
3条回答

U+NNNN只是用于讨论Unicode的常用符号。Python对于单个Unicode字符的语法是:

  • u'\xNN'对于通过U+00FF的Unicode字符
  • u'\uNNNN'对于通过U+FFFF的Unicode字符
  • u'\U00NNNNNN'对于通过U+10FFFF的Unicode字符(最大值)

注意:N是十六进制数字。

输入字符时使用正确的符号。您可以使用较长的符号,即使是低字符:

u'A' == u'\x41' == u'\u0041' == u'\U00000041'

通过编程,您还可以使用unichr(n)(python2)或chr(n)(python3)生成正确的字符。

请注意,在Python3.3之前,有Python的Unicode版本。unichr/chr只能支持sys.maxunicode,窄版本中为65535(0xFFFF),宽版本为1114111(0x10FFFF)。python3.3统一了构建,并用Unicode解决了许多问题。

如果您正在处理U+NNNN格式的文本字符串,这里有一个正则表达式(python3)。它查找U+和4-6个十六进制数字,并将它们替换为chr()版本。请注意,ASCII字符(Python2)或可打印字符(Python3)将显示实际字符,而不是转义版本。

^{pr2}$

我认为最可靠的方法是将数字解析为整数,然后使用unichr查找该代码点:

unichr(0x1f600)  # or: unichr(int('1f600', 16))

注意:在python3上,它只是chr

您可以查看json模块实现。似乎不是那么简单:

# Unicode escape sequence
uni = _decode_uXXXX(s, end)
end += 5
# Check for surrogate pair on UCS-4 systems
if sys.maxunicode > 65535 and \
0xd800 <= uni <= 0xdbff and s[end:end + 2] == '\\u':
    uni2 = _decode_uXXXX(s, end + 1)
    if 0xdc00 <= uni2 <= 0xdfff:
        uni = 0x10000 + (((uni - 0xd800) << 10) | (uni2 - 0xdc00))
        end += 6
char = unichr(uni)

(来自cpython-2.7.9/Lib/json/解码器.py第129-138行)

我认为直接使用json.loads会更容易:

^{pr2}$

相关问题 更多 >

    热门问题