Golang的utf8.FullRune()函数是否存在问题?

Golang的utf8.FullRune()函数是否存在问题? 在UTF-8编码中,切片 {0xED, 0xCF, 0xCF} 应该是一个无效的编码,但作为 utf8.FullRune 的输入,它却返回了 true

我想知道哪里出了问题?谢谢!

func main() {
    fmt.Println("hello world")
}
3 回复

我明白了!谢谢

更多关于Golang的utf8.FullRune()函数是否存在问题?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


utf8.FullRune 的文档说明:

FullRune 报告 p 中的字节是否以一个完整的 UTF-8 符文编码开头。无效的编码被视为一个完整的符文,因为它将转换为宽度为 1 的错误符文。

根据你的描述,utf8.FullRune() 函数在处理 {0xED, 0xCF, 0xCF} 这个字节切片时返回 true,这确实是符合预期的行为。utf8.FullRune() 仅检查字节切片是否包含一个完整的 UTF-8 编码序列,而不验证该序列是否是一个有效的 Unicode 码点。

{0xED, 0xCF, 0xCF} 是一个完整的 3 字节 UTF-8 序列(以 0xED 开头),但它在 Unicode 标准中是一个无效的编码(属于 UTF-8 编码中的无效代理区范围)。如果你需要验证有效性,应该使用 utf8.ValidRune()utf8.Valid() 函数。

示例代码:

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    data := []byte{0xED, 0xCF, 0xCF}
    
    // 检查是否为完整序列
    fmt.Println(utf8.FullRune(data)) // 输出: true
    
    // 检查是否为有效序列
    fmt.Println(utf8.Valid(data))    // 输出: false
    
    // 解码并检查单个符文
    r, size := utf8.DecodeRune(data)
    fmt.Printf("Decoded: %U, size: %d\n", r, size)
    fmt.Println(utf8.ValidRune(r))   // 输出: false
}

输出结果:

true
false
Decoded: U+FFFD, size: 3
false

注意:utf8.DecodeRune() 在遇到无效序列时会返回替换字符 U+FFFD

回到顶部