string - 我可以破坏 []byte 和字符串之间的数据转换吗?

标签 string go utf-8 character-encoding slice

在 Go 中,如果我从字符串 -> []byte 或相反,从 []byte -> 字符串转换,数据是否会被破坏。例如,假设我已经定义:

fooBytes := []byte(fooString)
fooConvertedBack := string(fooBytes
fooBytesConvertedBack := []byte(fooConvertedBack)

那么我们可以得到这样一种数据被破坏的情况:

fooString != fooConvertedBack
fooBytes != fooBytesConvertedBack

我猜答案是否定的。我正在处理随机字节数组,我想确保不会破坏数据,因为例如,golang 字符串有一个默认字符集,它不允许完全随机的字节。

base64编码字节更好吗?

最佳答案

正如 Cerise Limón 所写,它不会被破坏。 string[]byte 之间的转换不会解释字节,它只是按原样复制它们。

但是请注意,如果您要在 string[]rune 之间进行转换,那可能会更改内容,因为如 Spec: Conversions to and from a string type 中所写:

Converting a value of a string type to a slice of runes type yields a slice containing the individual Unicode code points of the string.

所以这个转换解码 rune (Unicode 代码点),如果输入的 string 不是有效的 UTF-8 编码文本,Unicode 替换字符 0xFFFD 将是在这种情况下使用。

例如,包含单个 0xff 字节的 string 不是有效的 UTF-8 编码文本:

fooString := "\xff"
barString := string([]rune(fooString))
fmt.Println(fooString == barString)
fmt.Printf("%x %x", fooString, barString)

输出(在 Go Playground 上尝试):

false
ff efbfbd

(注意:十六进制efbfdb是Unicode替换字符0xFFFD的3字节UTF-8编码值。)

关于string - 我可以破坏 []byte 和字符串之间的数据转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56437255/

相关文章:

java - 字符串无法转换为(类名数据类型)Java

linux - NT_GNU_BUILD_ID 有什么用?

swift -\u{...} 转义序列中的预期 '}'

java - 将字符串编码为 UTF-8

mysql - 是 "VARCHAR(255) CHARACTER SET utf8"255 个字节或 255 个字符

python - 将数组加入可读列表的最佳方法是什么?

java - 带有数学运算符的字符串到整数

java - 用于将嵌套列表字符串表示形式转换回列表的 Groovy/Java 方法

go - 如何将 uint64 转换为 uint?

go - 根据请求中的cookie设置http.FileServer的根文件系统