// 編碼所需的基本數(shù)字
const (
RuneError = '\uFFFD' // 錯(cuò)誤的 Rune 或 Unicode 代理字符
RuneSelf = 0x80 // ASCII 字符范圍
MaxRune = '\U0010FFFF' // Unicode 碼點(diǎn)的最大值
UTFMax = 4 // 一個(gè)字符編碼的最大長(zhǎng)度
)
// 將 r 轉(zhuǎn)換為 UTF-8 編碼寫(xiě)入 p 中(p 必須足夠長(zhǎng)士聪,通常為 4 個(gè)字節(jié))
// 如果 r 是無(wú)效的 Unicode 字符,則寫(xiě)入 RuneError
// 返回寫(xiě)入的字節(jié)數(shù)
func EncodeRune(p []byte, r rune) int
// 解碼 p 中的第一個(gè)字符略板,返回解碼后的字符和 p 中被解碼的字節(jié)數(shù)
// 如果 p 為空,則返回(RuneError, 0)
// 如果 p 中的編碼無(wú)效,則返回(RuneError, 1)
// 無(wú)效編碼:UTF-8 編碼不正確(比如長(zhǎng)度不夠)、結(jié)果超出 Unicode 范圍、編碼不是最短的讥电。
// 關(guān)于最短編碼:可以用四個(gè)字節(jié)編碼一個(gè)單字節(jié)字符纠炮,但它不是最短的,比如:
// [111100000 10000000 10000000 10111000] 不是最短的,應(yīng)該使用 [00111000]
func DecodeRune(p []byte) (r rune, size int)
// 功能同上婚被,參數(shù)為字符串
func DecodeRuneInString(s string) (r rune, size int)
// 解碼 p 中的最后一個(gè)字符窜觉,返回解碼后的字符逗余,和 p 中被解碼的字節(jié)數(shù)
// 如果 p 為空特咆,則返回(RuneError, 0)
// 如果 p 中的編碼無(wú)效啥繁,則返回(RuneError, 1)
func DecodeLastRune(p []byte) (r rune, size int)
// 功能同上适室,參數(shù)為字符串
func DecodeLastRuneInString(s string) (r rune, size int)
// FullRune 檢測(cè) p 中第一個(gè)字符的 UTF-8 編碼是否完整(完整并不表示有效)汽畴。
// 一個(gè)無(wú)效的編碼也被認(rèn)為是完整字符,因?yàn)樗鼘⒈晦D(zhuǎn)換為一個(gè) RuneError 字符绳匀。
// 只有“編碼有效但長(zhǎng)度不夠”的字符才被認(rèn)為是不完整字符。
// 也就是說(shuō),只有截去一個(gè)有效字符的一個(gè)或多個(gè)尾部字節(jié),該字符才算是不完整字符。
// 舉例:
// "好" 是完整字符
// "好"[1:] 是完整字符(首字節(jié)無(wú)效,可轉(zhuǎn)換為 RuneError 字符)
// "好"[2:] 是完整字符(首字節(jié)無(wú)效,可轉(zhuǎn)換為 RuneError 字符)
// "好"[:2] 是不完整字符(編碼有效但長(zhǎng)度不夠)
// "好"[:1] 是不完整字符(編碼有效但長(zhǎng)度不夠)
func FullRune(p []byte) bool
// 功能同上锌订,參數(shù)為字符串
func FullRuneInString(s string) bool
// 返回 p 中的字符個(gè)數(shù)
// 錯(cuò)誤的 UTF8 編碼和長(zhǎng)度不足的 UTF8 編碼將被當(dāng)作單字節(jié)的 RuneError 處理
func RuneCount(p []byte) int
// 功能同上芹关,參數(shù)為字符串
func RuneCountInString(s string) (n int)
// RuneLen 返回需要多少字節(jié)來(lái)編碼字符 r浇冰,如果 r 是無(wú)效的字符漂佩,則返回 -1
func RuneLen(r rune) int
// 判斷 b 是否為 UTF8 字符的首字節(jié)編碼养葵,最高位(bit)是不是 10 的字節(jié)就是首字節(jié)着绊。
func RuneStart(b byte) bool
// Valid 判斷 p 是否為完整有效的 UTF8 編碼序列。
func Valid(p []byte) bool
// 功能同上踩蔚,參數(shù)為字符串
func ValidString(s string) bool
// ValidRune 判斷 r 能否被正確的轉(zhuǎn)換為 UTF8 編碼
// 超出 Unicode 范圍的碼點(diǎn)或 UTF-16 代理區(qū)中的碼點(diǎn)是不能轉(zhuǎn)換的
func ValidRune(r rune) bool
// 示例
func main() {
b := make([]byte, utf8.UTFMax)
n := utf8.EncodeRune(b, '好')
fmt.Printf("%v:%v\n", b, n) // [229 165 189 0]:3
r, n := utf8.DecodeRune(b)
fmt.Printf("%c:%v\n", r, n) // 好:3
s := "大家好"
for i := 0; i < len(s); {
r, n = utf8.DecodeRuneInString(s[i:])
fmt.Printf("%c:%v ", r, n) // 大:3 家:3 好:3
i += n
}
fmt.Println()
for i := len(s); i > 0; {
r, n = utf8.DecodeLastRuneInString(s[:i])
fmt.Printf("%c:%v ", r, n) // 好:3 家:3 大:3
i -= n
}
fmt.Println()
b = []byte("好")
fmt.Printf("%t, ", utf8.FullRune(b)) // true
fmt.Printf("%t, ", utf8.FullRune(b[1:])) // true
fmt.Printf("%t, ", utf8.FullRune(b[2:])) // true
fmt.Printf("%t, ", utf8.FullRune(b[:2])) // false
fmt.Printf("%t\n", utf8.FullRune(b[:1])) // false
b = []byte("大家好")
fmt.Println(utf8.RuneCount(b)) // 3
fmt.Printf("%d, ", utf8.RuneLen('A')) // 1
fmt.Printf("%d, ", utf8.RuneLen('\u03A6')) // 2
fmt.Printf("%d, ", utf8.RuneLen('好')) // 3
fmt.Printf("%d, ", utf8.RuneLen('\U0010FFFF')) // 4
fmt.Printf("%d\n", utf8.RuneLen(0x1FFFFFFF)) // -1
fmt.Printf("%t, ", utf8.RuneStart("好"[0])) // true
fmt.Printf("%t, ", utf8.RuneStart("好"[1])) // false
fmt.Printf("%t\n", utf8.RuneStart("好"[2])) // false
b = []byte("你好")
fmt.Printf("%t, ", utf8.Valid(b)) // true
fmt.Printf("%t, ", utf8.Valid(b[1:])) // false
fmt.Printf("%t, ", utf8.Valid(b[2:])) // false
fmt.Printf("%t, ", utf8.Valid(b[:2])) // false
fmt.Printf("%t, ", utf8.Valid(b[:1])) // false
fmt.Printf("%t\n", utf8.Valid(b[3:])) // true
fmt.Printf("%t, ", utf8.ValidRune('好')) // true
fmt.Printf("%t, ", utf8.ValidRune(0)) // true
fmt.Printf("%t, ", utf8.ValidRune(0xD800)) // false 代理區(qū)字符
fmt.Printf("%t\n", utf8.ValidRune(0x10FFFFFF)) // false 超出范圍
}