27

为什么length函数说这个 8 个字符的字符串是 9 个字符?

>>> length "Níðhöggr"
9
4

2 回答 2

63

“Níðhöggr”包含 9 个 Unicode 字符:

U+004E N (Lu): LATIN CAPITAL LETTER N 
U+00ED í (Ll): LATIN SMALL LETTER I WITH ACUTE
U+00F0 ð (Ll): LATIN SMALL LETTER ETH 
U+0068 h (Ll): LATIN SMALL LETTER H 
U+006F o (Ll): LATIN SMALL LETTER O 
U+0308 ̈ (Mn): COMBINING DIAERESIS 
U+0067 g (Ll): LATIN SMALL LETTER G 
U+0067 g (Ll): LATIN SMALL LETTER G 
U+0072 r (Ll): LATIN SMALL LETTER R 

您可能想要使用“Níðhöggr”,它在打印出来时看起来相同,但包含U+00F6 LATIN SMALL LETTER O WITH DIAERESIS而不是两个字符的 ö 组合。换句话说,它是复合标准形式(NFC)。

或者您可能想要“Níðhöggr”,它有 10 个 Unicode 字符(í 是拆分 inti和组合重音符号)。那将是分解的范式(NFD)。

谷歌“Unicode 规范化”以获得有趣和/或毛茸茸的细节。使用此函数在 Haskell 中规范化 Unicode 数据(感谢 Adam Rosenfield!)。

于 2013-05-27T19:22:44.753 回答
21

因为您不是单个字符ö(U+00F6 拉丁小写字母 O 带分音符号);它是 U+006F 拉丁小写字母 O 加上 U+0308 组合分音符。

于 2013-05-27T19:22:30.233 回答