为什么 fmt.Printf("%x", 'ᚵ') ~> 16b5,而 fmt.Printf("%x", "ᚵ") ~> e19ab5?

Why does fmt.Printf("%x", 'ᚵ') ~> 16b5, while fmt.Printf("%x", "ᚵ") ~> e19ab5?

package main

import (
    "fmt"
)

func main() {
    fmt.Printf("%c, %x, %x", 'ᚵ', 'ᚵ', "ᚵ")
}

输出:

ᚵ, 16b5, e19ab5

https://play.golang.org/p/_Bs7JcdOfO

因为每个人做的事情都不一样。两者都将参数格式设置为十六进制数,但各自对参数的看法不同。

fmt.Printf("%x", 'ᚵ') 以 32 位整数 (int32) 的形式打印单个 unicode 字符(符文,如果你愿意的话)。

fmt.Printf("%x", "ᚵ") 将字符串(字符串的各个字节)打印为 8 位整数 (uint8)。当使用 utf-8 编码时,符文被编码为三个字节。这就是为什么有六个十六进制数字(每个字节两个)的原因。

要详细研究字符串的打印,请从文件 fmt/print.go 中的函数 fmtString 开始。

func (p *pp) fmtString(v string, verb rune) {