我正在将一个库从Java移植到Go。这个库传递所有参数并以字符串形式返回,并且由于后续步骤,我必须保持这种方式。我注意到当我将符文/ int8数组转换为字符串并转换回符文/ int8数组时,我获得了不同的值。我认为这是由Unicode字符引起的。有没有办法获得相同的价值?
package main
import "fmt"
func main() {
runes := make([]rune,3)
runes[0] = 97
runes[1] = -22
runes[2] = 99
s := string(runes)
fmt.Println(runes)
for _,r := range(s) {
fmt.Println(r)
}
}
输出:
[97 -22 99]
97
65533
99
答案 0 :(得分:3)
The Go Programming Language Specification
转换为字符串类型
将有符号或无符号整数值转换为字符串类型 包含整数的UTF-8表示的字符串。值 在有效的Unicode代码点范围之外转换为 " \ uFFFD"
将一片符文转换为字符串类型会产生一个字符串 各个符文值的串联转换为字符串。
Go中的byte
类型是uint8
类型的别名。
类型rune
,Unicode代码点(24位无符号整数),是int32
的别名。
将Unicode代码点(rune
s)编码为UTF-8编码string
s。
对于您的示例,
package main
import (
"fmt"
"unicode"
)
func main() {
// Unicode code points are 24-bit unsigned integers
runes := make([]rune, 3)
runes[0] = 97
runes[1] = -22 // invalid Unicode code point
runes[2] = 99
fmt.Println(runes)
// Encode Unicode code points as UTF-8
// Invalid code points converted to Unicode replacement character (U+FFFD)
s := string(runes)
fmt.Println(s)
// Decode UTF-8 as Unicode code points
for _, r := range s {
fmt.Println(r, string(r), r == unicode.ReplacementChar)
}
}
游乐场:https://play.golang.org/p/AZUBd2iZp1F
输出:
[97 -22 99]
a�c
97 a false
65533 � true
99 c false
参考文献:
The Go Programming Language Specification