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

// 编码所需的基本数字
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 超出范围
} ------------------------------------------------------------

Golang学习 - unicode/utf8 包的更多相关文章

  1. Golang学习 - unicode/utf16 包

    ------------------------------------------------------------ // IsSurrogate 判断 r 是否为代理区字符 // 两个代理区字符 ...

  2. Golang学习 - unicode 包

    ------------------------------------------------------------ const ( MaxRune = '\U0010FFFF' // Unico ...

  3. Golang学习笔记:包制作

    golang的包跟java as js之类的大不一样,一定要存在GOPATH里面,GOPATH是专门用于存放golang第三方的库,里面有两个文件夹, src:源代码目录 pkg:编译后的第三方包,这 ...

  4. Golang学习 - path/filepath 包

    ------------------------------------------------------------ filepath 中的函数会根据不同平台做不同的处理,比如路径分隔符.卷名等. ...

  5. Golang学习 - io/ioutil 包

    ------------------------------------------------------------ // Discard 是一个 io.Writer 接口,调用它的 Write ...

  6. golang学习资料[Basic]

    http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html 基础语法 <Go By Exa ...

  7. Golang学习:sublime text3配置golang环境

    最近导师让学习golang, 然后我就找了些有关golang的学习视频和网站. 昨天在电脑上下载了go tools, 之后在sublime上配置了golang的运行环境.By the way, 我的电 ...

  8. go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE

    go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...

  9. 【golang学习记录】环境搭建

    [golang学习记录]环境搭建 一. 概述 本文是[golang学习记录]系列文章的第一篇,安装Go语言及搭建Go语言开发环境,接下来将详细记录自己学习 go 语言的过程,一方面是为了巩固自己学到的 ...

随机推荐

  1. 使用ReflectionTestUtils解决依赖注入

    概述   当使用junit来测试Spring的代码时,为了减少依赖,需要给对象的依赖,设置一个mock对象,但是由于Spring可以使用@Autoware类似的注解方式,对私有的成员进行赋值,此时无法 ...

  2. Mellanox vma

    1,Mellanox offical vma Installation guide personal reading summarize VMA是一个消息加速器messaging accelerato ...

  3. 二、 C#调用存储过程

    个人比较喜欢使用第二种传递参数的方法 1. 调用的方法 public DataTable ExceStoredProcedure (string strCom, SqlParameter[] comm ...

  4. HDU 2100 分类: ACM 2015-06-17 23:49 15人阅读 评论(0) 收藏

    Lovekey Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. JavaIO(06)文件复制

    文件复制一般是采用两种方式进行操作: 1:将源文件中的内容全部读取到内存中,并一次性的写入到目标文件中:(不常用这种方式) 2:不将源文件中的内容全部读取进来,而是采用边读边写的方式:   实例01: ...

  6. hdu 5532 Almost Sorted Array

    http://acm.hdu.edu.cn/showproblem.php?pid=5532  题目大意: 给你一个不规则的序列,问是否能够通过删除一个元素使其成为一个有序的序列(递增或递减(其中相邻 ...

  7. POJ3185(简单BFS,主要做测试使用)

    没事做水了一道POJ的简单BFS的题目 这道题的数据范围是20,所以状态总数就是(1<<20) 第一次提交使用STL的queue,并且是在队首判断是否达到终点,达到终点就退出,超时:(其实 ...

  8. 集成StyleCop到Jenkins CI

    这是集成完stylecop之后的Jenkins,可以看到code review结果随每个build变化的图表,Build History里面可以看到#150之前的build状态是unstable,这是 ...

  9. 12.组合(Composition)

    组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合:它同样体现整体与部分间的关系,但此时整体与部分是不可分的,它们具有统一的生存期,整体的生命周期结 ...

  10. MongoDB下载与安装

    本节只针对MONGODB的安装进行介绍,具体mongodb的特点及优势可参考其他文件. 注意32位操作系统支持的最大文件为2GB,所以做大文件海量储存的朋友要选择64位的系统安装.开始我们的下载安装之 ...