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

时间:2016-01-18 18:20:56

标签: string unicode encoding go utf-8

invalid byte sequences无法转换为Unicode字符串。如何在Go中将 NewWindow.Show(); Window oldWindow = Application.Current.MainWindow; Application.Current.MainWindow = NewWindow; oldWindow.Close(); 转换为[]byte

时检测到这一点

1 个答案:

答案 0 :(得分:12)

正如Tim Cooper所说,你可以用utf8.Valid测试UTF-8的有效性。

但是!您可能认为将非UTF-8字节转换为Go string是不可能的。事实上,"In Go, a string is in effect a read-only slice of bytes";它可以包含不是有效UTF-8的字节,你可以打印,通过索引访问,甚至往返往[]byte(比如Write)。

Go语言中有两个地方可以为您执行string的UTF-8解码。

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

在这两种情况下,无效的UTF-8都替换为U+FFFDreplacement character保留用于此类用途。更多内容位于for statementsconversions between strings and other types的规范部分。 这些转换永远不会崩溃,因此您只需要主动检查UTF-8的有效性,如果它与您的应用程序相关,就像您想在错误编码的输入上抛出错误一样。 < / p>

由于这种行为已融入语言,因此您也可以从库中获得这种行为。 U+FFFDutf8.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]