为什么fmt.Printf(“%x”,“ᚵ')〜> 16b5,而fmt.Printf(“%x”,“ᚵ”)〜> e19ab5?

时间:2017-11-21 21:15:51

标签: go utf-8 string-formatting

package main

import (
    "fmt"
)

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

输出:

ᚵ, 16b5, e19ab5

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

1 个答案:

答案 0 :(得分:4)

因为每个人都做了不同的事情。两者都将参数格式化为十六进制数,但每个都以不同方式查看参数。

fmt.Printf("%x", 'ᚵ')打印一个unicode字符(符文,如果你愿意),作为32位整数(int32)。

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

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

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