我正在阅读Go Essentials:
在Go中,字符串是一个不可变的字节序列(8位字节值),这与像Python、C#、Java或Swift这样的语言不同,这些语言的字符串是Unicode。
我正在尝试以下代码:
s := "日本語"
b :=[]byte{0xe6, 0x97, 0xa5, 0xe6, 0x9c, 0xac, 0xe8, 0xaa, 0x9e}
fmt.Println(string(b) == s) // true
for i, runeChar := range b {
fmt.Printf("byte position %d: %#U\n", i, runeChar)
}
//byte position 0: U+00E6 'æ'
//byte position 1: U+0097
//byte position 2: U+00A5 '¥'
//byte position 3: U+00E6 'æ'
//byte position 4: U+009C
//byte position 5: U+00AC '¬'
//byte position 6: U+00E8 'è'
//byte position 7: U+00AA 'ª'
//byte position 8: U+009E
for i, runeChar := range string(b) {
fmt.Printf("byte position %d: %#U\n", i, runeChar)
}
//byte position 0: U+65E5 '日'
//byte position 3: U+672C '本'
//byte position 6: U+8A9E '語'
问题:
Golang在将字节数组转换为字符串进行编码时,从哪里获取Unicode?
rune
是如何形成的?Golang编译器是否会在编译过程中从文本文件编码中获取Unicode?将String实现为像Java中的utf-16字符数组而不是像字节数组一样的utf-8字符数组有什么优缺点?