// 第 4 周 – Go 中的字符编码：byte、rune、UTF-8
// 运行：go run ./w04/encoding
package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	s := "Aé世😀"

	// Go 的字符串是 UTF-8 编码的字节序列。
	fmt.Println("len(s)                 =", len(s))                    // 10 字节
	fmt.Println("utf8.RuneCountInString =", utf8.RuneCountInString(s)) // 4 个字符

	// 对字符串使用 range 得到的是 rune（码点），以及字节下标
	for i, r := range s {
		fmt.Printf("  byte index %d: %c  U+%04X  (%d bytes)\n", i, r, r, utf8.RuneLen(r))
	}

	// 下标访问得到的是字节 – 可能会落在多字节字符的“中间”!
	fmt.Print("byte by byte: ")
	for i := 0; i < len(s); i++ {
		fmt.Printf("%02X ", s[i])
	}
	fmt.Println()

	// 安全的逐字符处理：[]rune
	r := []rune(s)
	fmt.Println("length of []rune:", len(r), ", r[2] =", string(r[2]))

	// ASCII 运算
	c := 'c'
	fmt.Println("'c' - 'a' =", c-'a', "  '7' - '0' =", '7'-'0')
}
