为什么length
函数说这8个字符的字符串是9个字符?
>>> length "Níðhöggr"
9
答案 0 :(得分: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字符(í是分割整数i
和一个组合重音)。那将是分解正常形式(NFD)。
Google“Unicode规范化”,用于提供有趣和/或毛茸茸的细节。使用this function来规范化Haskell中的Unicode数据(感谢Adam Rosenfield!)。
答案 1 :(得分:21)
因为ö
不是单个字符ö
(U + 00F6 LATIN SMALL LETTER O WITH DIAERESIS);它的U + 006F拉丁文小写字母加上U + 0308结合了DIAERESIS。