Go中的角色可以跨越多个符文吗?

时间:2016-04-12 09:25:27

标签: go character-encoding

我在this blog

上看到了这个
  

即使使用符文切片,单个字符也可能跨越多个符文,例如,如果您的字符具有严重重音,则可能会发生这种情况。 “字符”这种复杂和模糊的特性是Go字符串表示为字节序列的原因。

这是真的吗? (这似乎是一个知道Go的人的博客)。我在我的机器上测试过,“è”是1个符文和2个字节。而Go doc似乎也不这么说了。

你遇到过这样的角色吗? (utf-8)一个角色可以在Go中跨越多个符文吗?

1 个答案:

答案 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字符。

另见:Combining character

编辑: “这不会扼杀'符文的概念'吗?”

答案:这不是符文的概念。 rune不是角色。符文是标识Unicode代码点的整数值。字符可以是一个Unicode代码点,其中1个字符是1 rune。大多数rune的一般用法都符合这种情况,所以在实践中这几乎不会令人头痛。这是Unicode standard的概念。