Golang中的字符串转换和Unicode

Rud*_*koŭ 1 string unicode byte char go

我正在阅读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 '?'
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 当从字符串捕获到字符串时,Golang从何处获得Unicode编码字节数组?rune形式如何?Golang编译器在编译期间是否从文本文件编码中获取Unicode?

  2. 以字节数组而不是Java中的utf-16 chars数组实现String的优缺点是什么?

pet*_*rSO 5

您引用的是一个不可靠的可靠资源:Go Essentials:Strings。除其他外,没有提及Unicode代码点或UTF-8编码。


例如,

package main

import "fmt"

func main() {
    s := "???"
    fmt.Printf("Glyph:             %q\n", s)
    fmt.Printf("UTF-8:             [% x]\n", []byte(s))
    fmt.Printf("Unicode codepoint: %U\n", []rune(s))
}
Run Code Online (Sandbox Code Playgroud)

游乐场:https : //play.golang.org/p/iaYd80Ocitg

输出:

Glyph:             "???"
UTF-8:             [e6 97 a5 e6 9c ac e8 aa 9e]
Unicode codepoint: [U+65E5 U+672C U+8A9E]
Run Code Online (Sandbox Code Playgroud)

参考文献:

Go博客:Go中的字符串,字节,符文和字符

Go编程语言规范

Unicode常见问题解答:UTF-8,UTF-16,UTF-32和BOM

Unicode联盟