即使使用符文切片,单个字符也可能跨越多个符文,例如,如果您的字符具有严重重音,则可能会发生这种情况。 “字符”这种复杂和模糊的特性是Go字符串表示为字节序列的原因。
这是真的吗? (这似乎是一个知道Go的人的博客)。我在我的机器上测试过,“è”是1个符文和2个字节。而Go doc似乎也不这么说了。
你遇到过这样的角色吗? (utf-8)一个角色可以在Go中跨越多个符文吗?
答案 0 :(得分:3)
是的,它可以:
s := "é́́"
fmt.Println(s, []rune(s))
输出(在Go Playground上尝试):
é́́ [101 769 769 769]
一个角色,4符文。它可能是任意长的......
取自The Go Blog: Text Normalization in Go。
的示例什么是角色?
正如字符串博客文章中提到的,字符可以跨越多个符文。例如,'e'和'◌'(急性“\ u0301”)可以组合形成'é'(NFD中的“e \ u0301”)。这两个符文一起是一个角色。字符的定义可能因应用程序而异。为了标准化,我们将它定义为一系列符文,以一个启动者开始,一个不会修改或与任何其他符文向后组合的符文,然后是可能为空的非启动序列,即符文(通常为重音符号) )。归一化算法在一次处理一个字符。
一个字符后面可以跟任意数量的modifiers(修饰符可以重复和堆叠):
理论上,可以构成Unicode字符的符文数量没有限制。实际上,对可以跟随字符的修饰符的数量没有限制,并且可以重复或堆叠修饰符。有没有见过三个尖锐的'e'?你去吧:'é'。根据标准,这是一个完全有效的4-rune字符。
编辑: “这不会扼杀'符文的概念'吗?”
答案:这不是符文的概念。 rune
不是角色。符文是标识Unicode代码点的整数值。字符可以是一个Unicode代码点,其中1个字符是1 rune
。大多数rune
的一般用法都符合这种情况,所以在实践中这几乎不会令人头痛。这是Unicode standard的概念。