为什么utf8.Validstring函数没有检测到无效的unicode字符?
从,我知道U+D800到U+DFFF是无效的。所以在十进制中,它是55296到57343 最大有效Unicode为'\U0010FFFF'。十进制是1114111 我的代码:为什么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
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})