the*_*ski 0 string utf-8 character-encoding go slice
在Go中,如果我从字符串-> [] byte转换,或者相反,从[] byte->字符串转换,数据是否可能会损坏。例如,假设我已定义:
fooBytes := []byte(fooString)
fooConvertedBack := string(fooBytes
fooBytesConvertedBack := []byte(fooConvertedBack)
Run Code Online (Sandbox Code Playgroud)
然后我们可以得到数据损坏的情况:
fooString != fooConvertedBack
fooBytes != fooBytesConvertedBack
Run Code Online (Sandbox Code Playgroud)
我猜这里的答案是否定的。我正在使用字节的随机数组,因此我想确保不会破坏数据,因为例如golang字符串具有默认字符集,该字符集不允许完全随机的字节。
base64编码字节更好吗?
正如CeriseLimón所写,它不会被损坏。在string和之间进行转换[]byte而不解释字节,它只是按原样复制它们。
但是请注意,如果要在string和之间进行转换[]rune,则可能会更改内容,如规范:在字符串类型之间来回转换:
将字符串类型的值转换为符文类型的切片会产生一个切片,其中包含字符串的各个Unicode代码点。
因此,此转换将对符文(Unicode代码点)进行解码,并且如果输入string不是有效的UTF-8编码文本,则0xFFFD在这种情况下将使用Unicode替换字符。
例如,string包含一个0xff字节的不是有效的UTF-8编码文本:
fooString := "\xff"
barString := string([]rune(fooString))
fmt.Println(fooString == barString)
fmt.Printf("%x %x", fooString, barString)
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上尝试):
false
ff efbfbd
Run Code Online (Sandbox Code Playgroud)
(注意:十六进制efbfdb是Unicode替换字符的3字节UTF-8编码值0xFFFD。)
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |