我试图在Go语言中计算“字符”的数量。也就是说,如果一个字符串包含一个可打印的“字形”,或者“组合字符”(或者某个人通常想到的字符),我希望它能够计算为1。例如,字符串“Hello, 世界”应该计数为11,因为有11个字符,人们会看到这个并说有11个字形。
utf8.RuneCountInString()在大多数情况下都很好用,包括ascii、重音符号、亚洲字符甚至表情符号。但是,据我所知,rune对应的是代码点,而不是字符。当我尝试使用基本表情符号时,它能正常工作,但是当我使用具有不同肤色的表情符号时,我得到了错误的计数:https://play.golang.org/p/aFIGsB6MsO
从我所读到的这里和这里来看,以下应该可以正常工作,但我似乎仍然没有得到正确的结果(它过度计数):
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;
}