存在无效的字节序列,无法将其转换为Unicode字符串。在Go中转换为时如何检测[]byte
到string
?
正如Tim Cooper所述,您可以使用来测试UTF-8有效性utf8.Valid
。
但!您可能会认为将非UTF-8字节转换为Gostring
是不可能的。实际上,“在Go中,字符串实际上是只读的字节片段”;它可能包含无效的UTF-8字节,您可以打印这些字节,通过索引进行访问,甚至往返返回到[]byte
(Write
例如)。
Go在您的语言中有两个地方可以对进行UTF-8解码string
。
for i, r := range s
,r
将Unicode代码点作为类型的值rune
[]rune(s)
,Go会将整个字符串解码为符文。(请注意,这rune
是的别名int32
,而不是完全不同的类型。)
在这两种情况下,都将无效的UTF-8替换为U+FFFD
,替换字符保留用于此类用途。在规范部分中,有关s和其他类型之间的for
语句和转换string
的更多信息。这些转换不会崩溃,因此,如果与应用程序相关,您只需要主动检查UTF-8有效性,就像您想对错误编码的输入引发错误。
由于该行为已融入语言中,因此您也可以从库中获得期望。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]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句