登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-13 13:27:25 113浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《如何检测何时无法在 Go 中将字节转换为字符串?》,这篇文章主要会讲到golang等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

存在无法转换为 Unicode 字符串的无效字节序列。在 Go中转换为时如何检测到这一点[]bytestring

正确答案

正如 Tim Cooper 所说,您可以使用utf8.Valid.

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

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+FFFDis[utf8.RuneError](https://godoc.org/unicode/utf8#pkg- constants)并由 中的函数返回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]

到这里,我们也就讲完了《如何检测何时无法在 Go 中将字节转换为字符串?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>