Python中的Unicode规范化算法

1 投票
1 回答
508 浏览
提问于 2025-05-16 18:45

我正在尝试在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 2Python 3Windows 操作系统上运行):

==> 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']

==>

另外,可以对比一下文档:

撰写回答