8

查看以下代码段:

>>> import unicodedata
>>> from unicodedata import normalize, name

>>> normalize('NFKD', u'\xb4')
u' \u0301'

>>> normalize('NFKD', u'a\xb4a')
u'a \u0301a'

>>> normalize('NFKC', u'a\xb4a')
u'a \u0301a'

>>> name(u'\xb4'), name(u'\u0301')
('ACUTE ACCENT', 'COMBINING ACUTE ACCENT')

我试图了解要翻译的行为u'\xb4'是否u' \u0301'正确。为什么它用空格填充组合的尖锐重音?为什么它要翻译 u\xb4呢?

文件格式中,我们看到ACUTE ACCENT曾经被称为SPACING ACUTE. 我想,这只是意味着光标应该移动而不是等待输入以下字符。

UPD:如果有人感兴趣,这里是一个列表,如果 NFKC 规范化后的 unicode 字符在开头有空格:http: //pastebin.com/Z99r5AK9

4

3 回答 3

11

重音字符是空格和组合重音字符的组合,如 Unicode 标准中所指定:

>>> import unicodedata
>>> unicodedata.decomposition(u'\xb4')
'<compat> 0020 0301'

\u00B4字符的历史有些模糊,但 Unicode 标准已决定将其视为空格 + 重音符号,尽管它经常被用作变音符号,请参阅此讨论

您也许可以\u02CA用作替代方案;它不被视为空格,并且没有指定分解。相反,它被限定为字母,因此您的里程可能会有所不同。

于 2012-12-19T14:51:05.950 回答
4

查看Unicode Collat​​ion Algorithm文档。特别要注意的是

兼容性规范化 (NFKC) 将独立重音折叠为空格 + 组合重音的组合。

于 2012-12-19T14:56:00.943 回答
3

在 NFKD 中,重音字符以“拆分”方式存储:首先是要重音的字符,然后是组合重音:u' \u0301'

在 NFKC 中,重音字符以“组合”方式存储:有一个专用的 Unicode 代码点:u'\xb4',它是u'\u00b4'.

它们都只代表重音,可以看作是空格字符上的重音。

于 2012-12-19T14:58:41.013 回答