当前位置: 首页 > 面试题库 >

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

胡景澄
2023-03-14
问题内容

存在无效的字节序列,无法将其转换为Unicode字符串。在Go中转换时如何检测[]bytestring


问题答案:

正如Tim
Cooper所述,您可以使用来测试UTF-8的有效性utf8.Valid

但!您可能会认为将非UTF-8字节转换为Go
string是不可能的。实际上,“在Go中,字符串实际上是只读的字节片段”;它可能包含无效的UTF-8字节,您可以打印这些字节,通过索引访问,甚至往返返回到[]byteWrite例如)。

Go在您的语言中有两个地方可以对进行UTF-8解码string

  • 当您执行操作时for i, r := range sr将Unicode代码点作为类型的值rune
  • 进行转换时[]rune(s),Go会将整个字符串解码为符文。

(请注意,这rune是的别名int32,而不是完全不同的类型。)

在这两种情况下,无效的UTF-8都被替换为U+FFFD,替换字符保留用于此类用途。在规范部分中,有关s和其他类型之间的for语句和转换string的更多信息。
这些转换不会崩溃,因此,如果与应用程序相关,您只需要主动检查UTF-8有效性,就像您想对错误编码的输入抛出错误。

由于该行为已融入语言中,因此您也可以从库中获得它。U+FFFDutf8.RuneError并且由中的函数html" target="_blank">返回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的新手,正在尝试执行以下操作: 我搜索了很多,但真的不知道该怎么做。 我知道这行不通: 问题答案: 这不是实现它的最有效方法,但是您可以简单地编写: 被称为:

  • 我试图通过API发送数据,但得到了类型错误:无法将字节转换为str。我理解这意味着我需要将部分代码转换为字节,但我不确定如何执行。我尝试在前面添加b或使用字节(“数据”),但可能将它们放在了错误的区域。 这是问题行: 我不确定什么和如何转换为字节。

  • 问题内容: 目前,我目前正在处理一些代码,其中涉及类型为var的 它具有价值,我可以像这样轻松访问: 很好,但是我希望能够使用该 函数,由于它需要type 而不是type ,因此通常会出错。 可以使用该功能的最合适的解决方案是什么,我想也许是某种转换方法? 问题答案: 您需要构造一个新的type数组才能使用: 请参阅相关的Golang常见问题解答条目:我可以将[] T转换为[]接口{}吗?

  • 如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?

  • 问题内容: 如何在python中将字节字符串转换为int? 这样说: 我想出了一个聪明/愚蠢的方法: 我知道必须有内置的东西或在标准库中可以更简单地执行此操作… 这与转换可以使用int(xxx,16)的十六进制数字字符串不同,但是我想转换一个实际字节值的字符串。 更新: 我有点喜欢James的回答,因为它不需要导入另一个模块,但是Greg的方法更快: 我的骇客方法: 进一步更新: 有人在评论中问导

  • 有没有办法将Java转换为(而不是装箱的)? 在尝试此过程中: 我得到了不同的输出。无法显示第一个输出,因为它是gzip字符串。 第二个是地址。我做错什么了吗?我需要一个中的结果来将其馈送到gzip解压缩器,如下所示。