Golang学习(14)——Unicode utf8包

1160636144 · · 1244 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Golang学习聽-聽unicode/utf8聽包

----------------------------

// 编码所需的基本数字

const (

聽聽聽聽RuneError = '\uFFFD'聽 聽 聽// 错误的 Rune 或 Unicode 代理字符

聽聽聽聽RuneSelf 聽= 0x80聽 聽 聽 聽 聽// ASCII 字符范围

聽聽聽聽MaxRune 聽 = '\U0010FFFF'聽// Unicode 码点的最大值

聽聽聽聽UTFMax聽 聽 = 4聽 聽 聽 聽 聽 聽 // 一个字符编码的最大长度

)

------------------------------------------------------------

// 将 r 转换为 UTF-8 编码写入 p 中(p 必须足够长,通常为 4 个字节)

// 如果 r 是无效的 Unicode 字符,则写入 RuneError// 返回写入的字节数

func聽EncodeRune(p []byte, r rune) int

// 解码 p 中的第一个字符,返回解码后的字符和 p 中被解码的字节数

// 如果 p 为空,则返回(RuneError, 0)

// 如果 p 中的编码无效,则返回(RuneError, 1)

// 无效编码:UTF-8 编码不正确(比如长度不够)、结果超出 Unicode 范围、编码不是最短的。

// 关于最短编码:可以用四个字节编码一个单字节字符,但它不是最短的,比如:

// [111100000 10000000 10000000 10111000] 不是最短的,应该使用 [00111000]

func聽DecodeRune(p []byte) (r rune, size int)

// 功能同上,参数为字符串

func聽DecodeRuneInString(s string) (r rune, size int)

// 解码 p 中的最后一个字符,返回解码后的字符,和 p 中被解码的字节数

// 如果 p 为空,则返回(RuneError, 0)

// 如果 p 中的编码无效,则返回(RuneError, 1)

func聽DecodeLastRune(p []byte) (r rune, size int)

// 功能同上,参数为字符串

func聽DecodeLastRuneInString(s string) (r rune, size int)

// FullRune 检测 p 中第一个字符的 UTF-8 编码是否完整(完整并不表示有效)。

// 一个无效的编码也被认为是完整字符,因为它将被转换为一个 RuneError 字符。

// 只有“编码有效但长度不够”的字符才被认为是不完整字符。

// 也就是说,只有截去一个有效字符的一个或多个尾部字节,该字符才算是不完整字符。

// 举例:

// "好"聽 聽 聽是完整字符

// "好"[1:] 是完整字符(首字节无效,可转换为 RuneError 字符)

// "好"[2:] 是完整字符(首字节无效,可转换为 RuneError 字符)

// "好"[:2] 是不完整字符(编码有效但长度不够)

// "好"[:1] 是不完整字符(编码有效但长度不够)

func聽FullRune(p []byte) bool

// 功能同上,参数为字符串

func聽FullRuneInString(s string) bool

// 返回 p 中的字符个数

// 错误的 UTF8 编码和长度不足的 UTF8 编码将被当作单字节的 RuneError 处理

func聽RuneCount(p []byte) int

// 功能同上,参数为字符串

func聽RuneCountInString(s string) (n int)

// RuneLen 返回需要多少字节来编码字符 r,如果 r 是无效的字符,则返回 -1

func聽RuneLen(r rune) int

// 判断 b 是否为 UTF8 字符的首字节编码,最高位(bit)是不是 10 的字节就是首字节。

func聽RuneStart(b byte) bool

// Valid 判断 p 是否为完整有效的 UTF8 编码序列。

func聽Valid(p []byte) bool

// 功能同上,参数为字符串

func聽ValidString(s string) bool

// ValidRune 判断 r 能否被正确的转换为 UTF8 编码

// 超出 Unicode 范围的码点或 UTF-16 代理区中的码点是不能转换的

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 聽代理区字符

聽聽聽聽fmt.Printf("%t\n", utf8.ValidRune(0x10FFFFFF)) // false 聽超出范围

}



有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:1160636144

查看原文:Golang学习(14)——Unicode utf8包

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

1244 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传