Python中的Unicode规范化算法
我正在尝试在Python中实现Unicode规范化(NFC和NFD)。
是的,我知道可以使用unicodedata.normaliza()
来完成这个任务。但我想自己学习怎么做。
所以,我输入的是é
。按照NFD的规范化,输出应该是e加上一个重音符号(́)。
我的方法是:
s = 'é'
s_len = len(s)
l = list()
for i in range(0, s_len):
l.append(ord(s[i])
# Now l has two elements [195, 169]
接下来,我使用了chr(195),得到了一个字符串'\xc3'
。但是当我尝试打印这个字符串时,它显示的是一个乱码字符。
我接下来应该怎么做呢?
相关问题:
- 暂无相关问题
1 个回答
0
正如 user2357112 在他的 评论 中提到的:
看起来你在使用 Python 2,而你不小心在处理一个包含 UTF-8 编码的字节串,而不是实际的 Unicode 字符串。你需要使用 Unicode 字符串。
下面这个脚本的输出可能会帮助你更深入地理解(注意 ['0xc3', '0xa9']
是表示带重音符的小写字母 E 的 UTF-8 字节序列):
# -*- coding: utf-8 -*-
from __future__ import print_function
import unicodedata
for s in 'é', r'é', u'é', unicodedata.normalize( 'NFD', u'é'):
### print ( '-')
s_len = len( s)
l = list()
L = list()
for i in range( 0, s_len):
l.append( ord( s[i]))
L.append( hex( ord( s[i])))
print ( s_len, '\t', s, '\t', repr( s), '\t', l, '\t' if s_len == 2 else '\t\t', L)
输出(注意上面的脚本可以在 Python 2
和 Python 3
的 Windows 操作系统上运行):
==> py -2 D:\test\Python\Py\43685143.py
2 é '\xc3\xa9' [195, 169] ['0xc3', '0xa9']
2 é '\xc3\xa9' [195, 169] ['0xc3', '0xa9']
1 é u'\xe9' [233] ['0xe9']
2 é u'e\u0301' [101, 769] ['0x65', '0x301']
==> py -3 D:\test\Python\Py\43685143.py
1 é 'é' [233] ['0xe9']
1 é 'é' [233] ['0xe9']
1 é 'é' [233] ['0xe9']
2 é 'é' [101, 769] ['0x65', '0x301']
==>
另外,可以对比一下文档:
Python 2
序列类型 —str
,unicode
,list
,tuple
,bytearray
,buffer
,xrange
Python 3
文本序列类型 —str