我很难理解将unicode表达式转换为各自的字符。我一直在研究unicode规范,我遇到了各种格式如下U+1F600
的字符串。据我所见,似乎没有内置函数知道如何将这些字符串转换为正确的Python格式,例如\U0001F600
。
在我的程序中,我制作了一个小的正则表达式,可以找到这些U\+.{5}
模式,并将U+
替换为\U000
。但是,我发现这个语法对于所有unicode字符都不相同,例如实际应该从U+200D
转换为\u200D
的零宽度连接。
因为我不知道正确的unicode转义序列的每个变体,处理这种情况的最佳方法是什么?我只能检查这些特殊字符的数量是否有限,或者我是否完全以错误的方式解决这个问题?
Python版本 2.7。
答案 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'\xNN'
通过U + FFFF u'\uNNNN'
通过U + 10FFFF(最大)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"')
ģ