Go 为什么fmt.Printf(";%x";,&x27;&x16B5;&x27;)~>;16b5,而fmt.Printf(“%x”、“x16B5”)~>;e19ab5?

Go 为什么fmt.Printf(";%x";,&x27;&x16B5;&x27;)~>;16b5,而fmt.Printf(“%x”、“x16B5”)~>;e19ab5?,go,utf-8,string-formatting,Go,Utf 8,String Formatting,产出: package main import ( "fmt" ) func main() { fmt.Printf("%c, %x, %x", 'ᚵ', 'ᚵ', "ᚵ") } 因为每个人做的事情都不一样。两者都将参数格式化为十六进制数,但对参数的看法各不相同 fmt.Printf(“%x”,”ᚵ')将单个unicode字符(符文,如果愿意)打印为32位整数(int32) fmt.Printf(“%x”ᚵ")将字符串(字符串的各个字节)打印为8位整数(uint8)。使用u

产出:

package main

import (
    "fmt"
)

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

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

fmt.Printf(“%x”,”ᚵ')将单个unicode字符(符文,如果愿意)打印为32位整数(int32)

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

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

ᚵ, 16b5, e19ab5

在我把问题写好之后,我就想出来了。也许也可以回答一下……你使用的语言有点混乱:它用单引号打印Unicode代码点(U+16B5).A codepoint是由unicode consortium分配的一个数字,以及该数字应表示的内容的描述。它没有说明如何在文本文件中表示该数字。它使用双引号打印UTF-8编码字符串中的原始字节。UTF-8中的字节不直接与8位字节对齐,因此没有明显的对应关系如果你只看十六进制字符,维基百科对它的工作原理有一个解释。听起来更好。把它作为一个答案,我会接受的;)
func (p *pp) fmtString(v string, verb rune) {