如何在 Go 中获取字符串的字符数?
例如,如果我有一个字符串 "hello"
该方法应该返回 5
。我看到 len(str)
返回字节数 而不是 字符数,所以 len("£")
返回 2 而不是 1,因为 £ 在 UTF-8 中用两个字节编码。
原文由 Ammar 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何在 Go 中获取字符串的字符数?
例如,如果我有一个字符串 "hello"
该方法应该返回 5
。我看到 len(str)
返回字节数 而不是 字符数,所以 len("£")
返回 2 而不是 1,因为 £ 在 UTF-8 中用两个字节编码。
原文由 Ammar 发布,翻译遵循 CC BY-SA 4.0 许可协议
有一种方法可以通过将字符串转换为 []rune as len([]rune(YOUR_STRING))
来获取没有任何包的符文计数:
package main
import "fmt"
func main() {
russian := "Спутник и погром"
english := "Sputnik & pogrom"
fmt.Println("count of bytes:",
len(russian),
len(english))
fmt.Println("count of runes:",
len([]rune(russian)),
len([]rune(english)))
}
字节数 30 16
符文数 16 16
原文由 Denis Kreshikhin 发布,翻译遵循 CC BY-SA 3.0 许可协议
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答2.7k 阅读✓ 已解决
1 回答3.3k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
您可以从 utf8 包中尝试
RuneCountInString
。如 本脚本 所示:“世界”的长度可能是 6(用中文写成:“世界”),但“世界”的符文数是 2:
Phrozen 在评论中 补充道:
其实你可以做
len()
over runes 通过类型转换。len([]rune("世界"))
将打印2
。至少在 Go 1.3 中。对于 CL 108985 (2018 年 5 月,对于 Go 1.11),
len([]rune(string))
现已优化。 (修复 问题 24923 )编译器自动检测
len([]rune(string))
模式,并将其替换为 for r := range s 调用。import “fmt” import “golang.org/x/text/unicode/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: %d\n”, nc) }
package uniseg
import ( “fmt”
)
func main() { gr := uniseg.NewGraphemes(“👍🏼!”) for gr.Next() { fmt.Printf(“%x “, gr.Runes()) } // Output: [1f44d 1f3fc] [21] }
”`
两个字素,即使有三个符文(Unicode 代码点)。
您可以在“ How to manipulate strings in GO to reverse them? ”中查看其他示例。
👩🏾🦰 单独是一个字素,但是,从 unicode 到代码点转换器,4 个符文: