Go Unicode 标准库
unicode
由于 UTF-8 的作者 Ken Thompson 同时也是 go 语言的创始人,所以说,在字符支持方面,几乎没有语言的理解会高于 go 了。
go 对 unicode 的支持包含三个包 :
- unicode
- unicode/utf8
- unicode/utf16
unicode 包包含基本的字符判断函数。utf8 包主要负责 rune 和 byte 之间的转换。utf16 包负责 rune 和 uint16 数组之间的转换。
由于字符的概念有的时候比较模糊,比如字符(小写 a)普通显示为 a,在重音字符中(grave-accented)中显示为à。 这时候字符(character)的概念就有点不准确了,因为 a 和à显然是两个不同的 unicode 编码,但是却代表同一个字符,所以引入了 rune。 一个 rune 就代表一个 unicode 编码,所以上面的 a 和à是两个不同的 rune。
go 语言的所有代码都是 UTF8 的,所以如果我们在程序中的字符串都是 utf8 编码的,但是我们的单个字符(单引号扩起来的)却是 unicode 的
unicode 包
unicode 包含了对 rune 的判断。这个包把所有 unicode 涉及到的编码进行了分类,使用结构
|
|
来表示这个功能的字符集。这些字符集都集中列表在 table.go 这个源码里面。
比如控制字符集:
|
|
比如对国内开发者很实用的汉字字符集:
|
|
回到包的函数,我们看到有下面这些判断函数:
|
|
看下面这个例子:
|
|
输出结果:
|
|
utf8 包
utf8 里面的函数就有一些字节和字符的转换。
判断是否符合 utf8 编码的函数:
func Valid(p []byte) bool
func ValidRune(r rune) bool
func ValidString(s string) bool
判断 rune 所占字节数:
func RuneLen(r rune) int
判断字节串或者字符串的 rune 数:
func RuneCount(p []byte) int
func RuneCountInString(s string) (n int)
编码和解码到 rune:
|
|
是否为完整 rune:
func FullRune(p []byte) bool
func FullRuneInString(s string) bool
是否为 rune 第一个字节:
func RuneStart(b byte) bool
示例:
|
|
运行结果:
|
|
utf16 包
utf16 的包的函数就比较少了。
将 uint16 和 rune 进行转换
|
|
unicode 有个基本字符平面和增补平面的概念,基本字符平面只有 65535 个字符,增补平面(有 16 个)加上去就能表示 1114112 个字符。 utf16 就是严格实现了 unicode 的这种编码规范。
而基本字符和增补平面字符就是一个代理对(Surrogate Pair)。一个代理对可以和一个 rune 进行转换。
示例:
|
|
输出结果:
|
|