Unicode表示格式化Unicode?

时间:2017-01-18 23:33:57

标签: python python-2.7 unicode emoji python-unicode

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

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

因为我不知道正确的unicode转义序列的每个变体,处理这种情况的最佳方法是什么?我只能检查这些特殊字符的数量是否有限,或者我是否完全以错误的方式解决这个问题?

Python版本 2.7。

3 个答案:

答案 0 :(得分:3)

我认为您最可靠的方法是将数字解析为整数,然后使用unichr(0x1f600) # or: unichr(int('1f600', 16)) 来查找该代码点:

chr

注意:在Python 3上,它只是@EBean public class InjectableArrayList<T> extends ArrayList<T>{}

答案 1 :(得分:3)

U+NNNN只是用来谈论Unicode的常用符号。 Python的单个Unicode字符的语法是以下之一:

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

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

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

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

以编程方式,您还可以使用unichr(n)(Python 2)或chr(n)(Python 3)生成正确的字符。

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

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

>>> re.sub(r'U\+([0-9A-Fa-f]{4,6})',lambda m: chr(int(m.group(1),16)),'testing U+1F600')
'testing \U0001f600'
>>> re.sub(r'U\+([0-9A-Fa-f]{4,6})',lambda m: chr(int(m.group(1),16)),'testing U+5000')
'testing \u5000'
>>> re.sub(r'U\+([0-9A-Fa-f]{4,6})',lambda m: chr(int(m.group(1),16)),'testing U+0041')
'testing A'
>>> re.sub(r'U\+([0-9A-Fa-f]{4,6})',lambda m: chr(int(m.group(1),16)),'testing U+0081')
'testing \x81'

答案 2 :(得分:0)

您可以查看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 / decoder.py第129-138行)

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

>>> print json.loads('"\\u0123"')
ģ