有invalid byte sequences无法转换为Unicode字符串。如何在Go中将 NewWindow.Show();
Window oldWindow = Application.Current.MainWindow;
Application.Current.MainWindow = NewWindow;
oldWindow.Close();
转换为[]byte
答案 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+FFFD
,replacement character保留用于此类用途。更多内容位于for
statements和conversions between string
s and other types的规范部分。 这些转换永远不会崩溃,因此您只需要主动检查UTF-8的有效性,如果它与您的应用程序相关,就像您想在错误编码的输入上抛出错误一样。 < / p>
由于这种行为已融入语言,因此您也可以从库中获得这种行为。 U+FFFD
为utf8.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]