为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕森王 2021-12-13 10:23:16
存在无法转换为 Unicode 字符串的无效字节序列。如何检测转换时[]byte要string进去吗?
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

正如 Tim Cooper 所指出的,您可以使用utf8.Valid.

但!您可能认为将非 UTF-8 字节转换为 Gostring是不可能的。事实上,“在 Go 中,一个字符串实际上是一个只读的字节片”;它可以包含无效的 UTF-8 字节,您可以打印这些字节、通过索引访问、传递给WriteString方法,甚至返回到 a []byteWrite例如)。

Go 语言中有两个地方确实string为你做s 的UTF-8 解码。

  • 当你这样做时for i, r := range sr是一个 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 main


import "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]


查看完整回答
反对 回复 2021-12-13
  • 1 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信