您可以
RuneCountInString从 utf8 包中尝试。
返回 p 中的符文数
那个,如这个脚本所示:“世界”的长度可能是6(用中文写时:“世界”),但它的符文计数是2:
package mainimport "fmt"import "unipre/utf8"func main() { fmt.Println("Hello, 世界", len("世界"), utf8.RuneCountInString("世界"))}Phrozen在评论中]补充道:
实际上,您可以
len()通过类型转换来完成符文。
len([]rune("世界"))将打印2。至少在 Go 1.3 中。
并与CL 108985(五月2018年,为围棋1.11),
len([]rune(string))现在已经进行了优化。(修复问题 24923)
编译器
len([]rune(string))自动检测模式,并将其替换为 for r := range s 调用。
添加一个新的运行时函数来计算字符串中的符文。修改编译器以检测模式
len([]rune(string))并将其替换为新的符文计数运行时函数。golangRuneCount/lenruneslice/ASCII 27.8ns ± 2% 14.5ns ± 3% -47.70%RuneCount/lenruneslice/Japanese 126ns ± 2% 60 ns ± 2% -52.03%RuneCount/lenruneslice/MixedLength 104ns ± 2% 50 ns ± 1% -51.71%
什么是字符?
字符可以跨越多个符文。
例如,’e‘ 和 ‘◌́◌́’(急性“u0301”)可以组合形成 ‘é’(eu0301NFD 中的“ ”)。这两个符文加在一起就是一个字符。字符的定义可能因应用程序而异。
对于规范化,我们将其定义为:
- 以起始符开头的一系列符文,
- 不修改或与任何其他符文反向组合的符文,
- 后跟可能为空的非起始序列,即执行的符文(通常是重音符号)。
归一化算法一次处理一个字符。
使用该包及其
Iter类型,“字符”的实际数量将是:
package mainimport "fmt"import "golang.org/x/text/unipre/norm"func main() { var ia norm.Iter ia.InitString(norm.NFKD, "école") nc := 0 for !ia.Done() { nc = nc + 1 ia.Next() } fmt.Printf("Number of chars: %dn", nc)}在这里,这使用了Unipre 规范化形式NFKD“兼容性分解”
指出,UNICODE 文本分割是可靠确定某些重要文本元素(用户感知的字符、单词和句子)之间默认边界的唯一方法。
为此,您需要一个像rivo/uniseg这样的外部库,它执行Unipre Text Segmentation。
将实际计数“字形簇”,其中多个码点可被组合成一个用户感知的字符。
package unisegimport ( "fmt" "github.com/rivo/uniseg")func main() { gr := uniseg.NewGraphemes("


