我在这个博客上读到的
即使使用符文切片,单个字符也可能跨越多个符文,例如,如果您的字符具有严重的重音,则可能发生这种情况。“字符”的这种复杂和模棱两可的性质是Go字符串被表示为字节序列的原因。
是真的吗?(这似乎是一个知道围棋的人写的博客)。我在我的机器上进行了测试,"è“是1符文和2字节。而去吧医生似乎不这么说。
你见过这样的人物吗?(utf-8)一个角色能在围棋中跨越多个符文吗?
发布于 2016-04-12 09:29:41
是的,可以:
s := "é́́"
fmt.Println(s, []rune(s))输出(在围棋游乐场上尝试):
é́́ [101 769 769 769]一个角色,四个符文。可能是武断的长时间..。
示例摘自Go博客: Go中的文本规范化。
什么是角色? 正如在字符串博客文章中提到的,字符可以跨越多个文本。例如,'e‘和'◌́’(急性“\u 0301”)可以组合成'é‘(NFD中的“e\0301”)。这两个符文合在一起是一个字符。字符的定义可能因应用程序的不同而有所不同。对于规范化,我们将把它定义为以一个启动符开始的一个符文序列,一个不与任何其他符文反向修改或组合的符文,然后可能是空的非起始符序列,也就是说,符文(通常是重音)。该归一化算法同时处理一个字符。
字符后面可以跟着任意数量的修饰符 (可以重复和堆叠修饰符):
理论上,没有绑定到可以构成Unicode字符的符数。事实上,对一个字符后面的修饰符数量没有限制,一个修饰符可以重复,或者堆叠。有没有见过有三个音符的e?给你:'é́́‘。根据标准,这是一个完全有效的4符文字符.
另见:组合字符。
编辑:“这不是扼杀了‘符文的概念’吗?”
答:这不是符文的概念。rune不是一个字符。rune是标识Unicode代码点的整数值。一个字符可以是一个Unicode代码点,在这种情况下,1字符是1 rune。rune的大多数通用用法都适用于这种情况,因此在实践中,这几乎不会让人头痛。这是Unicode标准的一个概念。
https://stackoverflow.com/questions/36569018
复制相似问题