gpt4 book ai didi

string - 计算golang字符串中的字符

转载 作者:IT王子 更新时间:2023-10-29 01:08:17 27 4
gpt4 key购买 nike

我正在尝试计算 go 中的“字符”。也就是说,如果一个字符串包含一个可打印的“字形”或“组合字符”(或某些人通常认为的字符),我希望它计数为 1。例如,字符串“你好,世🖖🏿🖖界”,应该算作 11,因为有 11 个字符,人类看到它会说有 11 个字形。

utf8.RuneCountInString() 在大多数情况下效果很好,包括 ascii、重音符号、亚洲字符甚至表情符号。但是,据我了解, rune 对应于代码点,而不是字符。当我尝试使用基本的表情符号时它起作用了,但是当我使用具有不同肤色的表情符号时,我得到了错误的计数:https://play.golang.org/p/aFIGsB6MsO

从我读到的herehere以下应该有效,但我似乎仍然没有得到正确的结果(多算):

func CountCharactersInString(str string) int {
var ia norm.Iter
ia.InitString(norm.NFC, str)
nc := 0
for !ia.Done() {
nc = nc + 1
ia.Next()
}
return nc
}

这也行不通:

func GraphemeCountInString(str string) int {
re := regexp.MustCompile("\\PM\\pM*|.")
return len(re.FindAllString(str, -1))
}

我在 Objective C 中寻找类似的东西:

+ (NSInteger)countCharactersInString:(NSString *) string {
// --- Calculate the number of characters enterd by user and update character count label
NSInteger count = 0;
NSUInteger index = 0;
while (index < string.length) {
NSRange range = [string rangeOfComposedCharacterSequenceAtIndex:index];
count++;
index += range.length;
}
return count;
}

最佳答案

我写了一个包可以让你这样做:https://github.com/rivo/uniseg .它根据 Unicode Standard Annex #29 中指定的规则断开字符串这就是你要找的。以下是您将如何在您的案例中使用它:

package main

import (
"fmt"

"github.com/rivo/uniseg"
)

func main() {
fmt.Println(uniseg.GraphemeClusterCount("Hello, 世🖖🏿🖖界"))
}

这将按您的预期打印 11

关于string - 计算golang字符串中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com