Golang中为什么RuneCountInString返回的长度不正确

Golang中为什么RuneCountInString返回的长度不正确

t := “<img src="https://forum.golangbridge.org/images/emoji/google/u6709.png?v=12" title=":u6709:" class="emoji" alt=":u6709:" loading="lazy" width="20" height="20">”
fmt.Println(utf8.RuneCountInString(t)) // 2
2 回复

你好 @javacode123

欢迎来到论坛。

在 Go Playground 中,结果是 1

你发布的是在你那边返回 2 的原始代码吗? 你使用的是哪个 Go 版本? 你能否在不止一个操作系统上复现这个错误的结果?

更多关于Golang中为什么RuneCountInString返回的长度不正确的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,utf8.RuneCountInString 返回的是字符串中Unicode码点(rune)的数量,而不是字节数。从你的代码来看,字符串 t 包含了一个HTML <img> 标签,其中可能包含多字节的Unicode字符(比如表情符号或非ASCII字符),这会导致 RuneCountInString 返回的值与预期不符。具体来说,如果字符串中有像 :u6709: 这样的Unicode转义序列或实际的多字节字符,每个这样的字符会被计为一个rune。

在你的例子中,t 字符串包含了一个表情符号的Unicode表示(如 :u6709:),这可能被解析为多个rune。实际上,utf8.RuneCountInString(t) 返回 2,这表明字符串中有两个Unicode码点。这可能是因为字符串中的某些部分(如 :u6709:)被当作单独的rune处理,或者存在隐藏的多字节字符。

为了验证,你可以遍历字符串并打印每个rune,以查看具体有哪些Unicode字符。以下是一个示例代码:

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    t := `<img src="https://forum.golangbridge.org/images/emoji/google/u6709.png?v=12" title=":u6709:" class="emoji" alt=":u6709:" loading="lazy" width="20" height="20">`
    fmt.Println("Rune count:", utf8.RuneCountInString(t)) // 输出: 2
    
    // 遍历字符串并打印每个rune及其字节长度
    for i, r := range t {
        fmt.Printf("Rune at position %d: %q (Unicode: U+%04X, byte length: %d)\n", i, r, r, utf8.RuneLen(r))
    }
}

运行这段代码会显示字符串中每个rune的详细信息。如果输出显示有额外的Unicode字符(如零宽度空格或其他控制字符),这可能导致计数为2。检查字符串中是否包含不可见字符,例如通过字符串字面量中的转义序列引入的。在Go中,字符串字面量中的Unicode转义序列(如 \u6709)会被解码为对应的Unicode字符,这可能增加rune计数。

总之,RuneCountInString 的行为是正确的,它基于Unicode码点计数。问题可能源于字符串内容中的多字节字符或隐藏Unicode字符。使用上述遍历方法可以帮你识别具体的rune。

回到顶部