为什么utf8.Validstring函数没有检测到无效的unicode字符?

为什么utf8.Validstring函数没有检测到无效的unicode字符?,unicode,go,utf-8,Unicode,Go,Utf 8,从,我知道U+D800到U+DFFF是无效的。所以在十进制中,它是55296到57343 最大有效Unicode为'\U0010FFFF'。十进制是1114111 我的代码: package main import "fmt" import "unicode/utf8" func main() { fmt.Println("Case 1(Invalid Range)") str := fmt.Sprintf("%c", rune(55296+1)) if !utf8

从,我知道U+D800到U+DFFF是无效的。所以在十进制中,它是55296到57343

最大有效Unicode为'\U0010FFFF'。十进制是1114111

我的代码:

package main

import "fmt"
import "unicode/utf8"

func main() {

    fmt.Println("Case 1(Invalid Range)")
    str := fmt.Sprintf("%c", rune(55296+1))
    if !utf8.ValidString(str) {
        fmt.Print(str, " is not a valid Unicode")
    } else {
        fmt.Println(str, " is valid unicode character")
    }

    fmt.Println("Case 2(More than maximum valid range)")
    str = fmt.Sprintf("%c", rune(1114111+1))
    if !utf8.ValidString(str) {
        fmt.Print(str, " is not a valid Unicode")
    } else {
        fmt.Println(str, " is valid unicode character")
    }
}

为什么ValidString函数对于输入的无效unicode字符不返回false?我确信我的理解是错误的,有人能解释一下吗???

你取了一个无效的值,然后用Sprintf转换它。它被转换为错误值。然后检查错误值,该值是有效的Unicode代码点

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {

    fmt.Println("Case 1: Invalid Range")
    str := fmt.Sprintf("%c", rune(55296+1))
    fmt.Printf("%q %X %d %d\n", str, str, []rune(str)[0], utf8.RuneError)
    if !utf8.ValidString(str) {
        fmt.Print(str, " is not a valid Unicode")
    } else {
        fmt.Println(str, " is valid unicode character")
    }

    fmt.Println("Case 2: More than maximum valid range")
    str = fmt.Sprintf("%c", rune(1114111+1))
    fmt.Printf("%q %X %d %d\n", str, str, []rune(str)[0], utf8.RuneError)
    if !utf8.ValidString(str) {
        fmt.Print(str, " is not a valid Unicode")
    } else {
        fmt.Println(str, " is valid unicode character")
    }

}
输出:

Case 1: Invalid Range
"�" EFBFBD 65533 65533
�  is valid unicode character
Case 2: More than maximum valid range
"�" EFBFBD 65533 65533
�  is valid unicode character

您的问题发生在Sprintf中。由于您给它一个无效字符,Sprintf将其替换为
符文(65533)
,这是用来代替无效字符的unicode替换字符。因此,您的字符串是有效的UTF8

如果您执行以下操作,也会发生这种情况:
str:=string([]符文{55297})
,因此在创建符文时可能会发生这种情况。从以下方面看,这一点并不明显:

如果要强制字符串包含无效的UTF8,可以这样编写第一个字符串:

str := string([]byte{237, 159, 193})