ASCII 与 Unicode 与 UTF-8

var ch int = '\u0041'
var ch2 int = '\u03B2'
var ch3 int = '\U00101234'
fmt.Printf("%d - %d - %d\n", ch, ch2, ch3) // integer
fmt.Printf("%c - %c - %c\n", ch, ch2, ch3) // character
fmt.Printf("%X - %X - %X\n", ch, ch2, ch3) // UTF-8 bytes
fmt.Printf("%U - %U - %U\n", ch, ch2, ch3) // UTF-8 code point

\u0041 是什么意思

第一句将 ch 声明为整形,但是却用 Unicode 的方法来表示这个整数,它与 var ch int = 65 完全一致,\u0041\u03B2 为 Unicode 码点,后面的数字为16进制表示,计算 4*16+1 刚好等于 65

ASCII 是什么

只有128 个的数字码与字符的对应规则,eg: 大写字母 A 对应的码为 65(十进制)或0x41(十六进制)

Unicode 是什么

万国码,每一种语言的每一个文字都有一个唯一的码对应,eg:大写字母 A 对应的码为 U+0041 , 汉字「尸」对应的 Unicode 码为 U+5C38

UTF-8/UTF-16/UTF-32 是什么

不定存储长度的基于 Unicode 的编码规则,此编码规则的开始的一小段(0-127)和ASCII 码相同,即 65-90位为大写英文字母 A-Z,97-122 位为a-z,eg:大写字母A在 UTF-8 编码规则下表示为 0x41 , 在 UTF-16 编码规则下表示为 0x0041 , 在 UTF-32 编码规则下表示为 0x00000041

为什么 UTF-8 编码规则下的0x后面是两位数字

UTF-8 即用 8 位二进制数字(eg: 10001000)来表示字符,在最大只能容纳 8 位的限制下,其能表示的最大数字也是两位十六进制数字可以表示的最大值,也就是说 11111111 ( 二进制 ) = 0xFF ( 十六进制 )

UTF-16/UTF-32 同理