为什么长度为"Níðhöggr"9?

Dog*_*Dog 27 unicode haskell

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

>>> length "Níðho?ggr"
9
Run Code Online (Sandbox Code Playgroud)

Pet*_*rin 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 
Run Code Online (Sandbox Code Playgroud)

您可能想要使用"Níðhöggr",打印时看起来相同,但包含的U+00F6 LATIN SMALL LETTER O WITH DIAERESIS不是两个字符的组合.换句话说,它处于组合的正常形式(NFC).

或者你可能想要"Níðhöggr",它有10个Unicode字符(í是分割int i和组合重音).这将被分解为正常形式(NFD).

谷歌"Unicode规范化"有趣和/或毛茸茸的细节.使用此函数来规范化Haskell中的Unicode数据(感谢Adam Rosenfield!).

  • @Dog什么是信? (15认同)
  • @Dog:特别是[Data.Text.ICU.Break.breakCharacter](http://hackage.haskell.org/packages/archive/text-icu/0.6.3.5/doc/html/Data-Text-ICU- Break.html)似乎将文本分解为正确的单位.请注意,此操作依赖于语言环境(例如,`ll`在某些语言中是单个字符,在其他语言中是两个字符,这可能很重要). (8认同)
  • @Dog:我想你想阅读[this](http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries). (6认同)
  • @Dog,Unicode字符*的实际长度是*9.如果您还需要其他内容,您可能希望执行转换为Unicode规范化表单. (5认同)
  • @Dog这是真正的长度,字符串由9个代码点组成.`Char`是一个代码点(不是字符). (5认同)
  • @Dog`length $ filter Data.Char.isLetter"Níðhöggr"`. (4认同)
  • 在处理Unicode时避免使用术语"字符"是个好主意.不幸的是,这些天它不是一个技术术语."代码单元","代码点"和"字形"是各种技术术语,涵盖"字符"可以表示的不同方面. (2认同)

Cai*_*von 21

因为你o?不是单个字符ö(U + 00F6 LATIN SMALL LETTER O WITH DIAERESIS); 这是U + 006F LATIN小写字母O加上U + 0308组合DIAERESIS.