猿问

如何检测 Go 中何时无法将字节转换为字符串?

存在无法转换为 Unicode 字符串的无效字节序列。如何检测转换时[]bytestring进去吗?


慕森王
浏览 214回答 1
1回答

浮云间

正如 Tim Cooper 所指出的,您可以使用utf8.Valid.但!您可能认为将非 UTF-8 字节转换为 Gostring是不可能的。事实上,“在 Go 中,一个字符串实际上是一个只读的字节片”;它可以包含无效的 UTF-8 字节,您可以打印这些字节、通过索引访问、传递给WriteString方法,甚至返回到 a []byte(Write例如)。Go 语言中有两个地方确实string为你做s 的UTF-8 解码。当你这样做时for i, r := range s,r是一个 Unicode 代码点作为类型的值rune当您进行转换时[]rune(s),Go 会将整个字符串解码为符文。(请注意,这rune是 的别名int32,而不是完全不同的类型。)在这两种情况下,无效的 UTF-8 被替换为U+FFFD,替换字符保留用于此类用途。更多信息请参见规范部分中关于s 和其他类型之间的for语句和转换string的内容。这些转换永远不会崩溃,因此您只需要主动检查 UTF-8 有效性是否与您的应用程序相关,例如如果您不能接受 U+FFFD 替换并且需要在错误编码的输入上引发错误。由于该行为已融入语言,因此您也可以从库中期待它。U+FFFDisutf8.RuneError并由 中的函数返回utf8。这是一个示例程序,显示了 Go 对[]byte持有无效 UTF-8 的处理:package mainimport "fmt"func main() {    a := []byte{0xff}    s := string(a)    fmt.Println(s)    for _, r := range s {        fmt.Println(r)    }    rs := []rune(s)    fmt.Println(rs)}输出在不同的环境中看起来会有所不同,但在 Playground 中看起来像�65533[65533]
随时随地看视频慕课网APP

相关分类

Go
我要回答