如何在Python 3.3中将字符转换为五位数字的Unicode?
我想在Python 3.3中把一些字符转换成五位数的unicode编码。比如,
import re
print(re.sub('a', u'\u1D15D', 'abc' ))
但是结果和我预期的不一样。我是不是应该直接用字符本身,而不是用代码点?有没有更好的方法来处理五位数的unicode字符?
2 个回答
1
顺便说一下,你并不需要用到 re
模块。你可以使用 str.translate 来实现这个功能:
>>> 'abc'.translate({ord('a'):'\U0001D15D'})
'bc'
18
在Python中,unicode转义字符有两种形式:一种是4个十六进制数字(比如\uabcd
),另一种是8个十六进制数字(比如\Uabcdabcd
)。如果你要表示的字符代码超过了U+FFFF,就需要用后者(大写的U),并且要确保前面填充足够的零。
>>> '\U0001D15D'
''
>>> '\U0001D15D'.encode('unicode_escape')
b'\\U0001d15d'
在上面的例子中,U+1D15D这个字符(表示“全音符”)确实在里面,但你的浏览器字体可能无法显示它,可能会用一个占位符(比如一个方框或者问号)来代替。
因为你使用了\uabcd
这种转义方式,所以在abc
中把a
替换成了两个字符,一个是代码点U+1D15(ᴕ
,表示小写的拉丁字母大写ou),另一个是ASCII字符D
。使用32位的unicode字面量是可以正常工作的:
>>> import re
>>> print(re.sub('a', '\U0001D15D', 'abc' ))
bc
>>> print(re.sub('a', u'\U0001D15D', 'abc' ).encode('unicode_escape'))
b'\\U0001d15dbc'
同样,U+1D15D这个代码点在你的字体中可能也会显示为占位符。