1 回答
TA贡献1829条经验 获得超4个赞
正如 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+FFFD
isutf8.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]
- 1 回答
- 0 关注
- 212 浏览
添加回答
举报