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

Tho*_*mas 2 character-encoding go

我在这个博客上读到这个

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

这是真的吗?(这似乎是一个了解 Go 的人写的博客)。我在我的机器上测试过,“è”是 1 个符文和 2 个字节。而围棋文档似乎另有说。

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

icz*_*cza 5

是的,它可以:

s := "e???"
fmt.Println(s, []rune(s))
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

e??? [101 769 769 769]
Run Code Online (Sandbox Code Playgroud)

一个角色,4个符文。它可能是任意长...

示例取自Go 博客:Go 中的文本规范化

什么是字符?

正如字符串博客文章中提到的,字符可以跨越多个符文。例如,“e”和“??” (急性“\u0301”)可以组合形成“é”(NFD 中的“e\u0301”)。这两个符文加在一起是一个字符。字符的定义可能因应用程序而异。为了规范化,我们将其定义为以起始符开头的符文序列,一个不修改或与任何其他符文反向组合的符文,其后可能是非起始符的空序列,也就是说,符文(通常是重音符号) )。归一化算法一次处理一个字符。

一个字符可以跟任意数量的修饰符(修饰符可以重复和堆叠):

理论上,可以组成一个 Unicode 字符的符文数量是没有限制的。事实上,对可以跟随一个角色的修饰符的数量没有限制,修饰符可以重复或堆叠。见过带有三个锐角的“e”吗?给你:'e???'。根据标准,这是一个完全有效的 4 符文字符。

另请参阅:组合字符

编辑: “这不是扼杀了‘符文概念’吗?”

答:这不是符文的概念。Arune不是字符。符文是标识 Unicode 代码点的整数值。一个字符可能是一个 Unicode 代码点,在这种情况下 1 个字符是 1 runerunes 的大多数一般用法都适合这种情况,因此在实践中这几乎不会让人头疼。它是Unicode 标准的一个概念。