Go语言中多字节字符的处理

1 概述

Go语言的字符串是使用 编码的。 是 的实现方式之一。本文内容包括: 和 的关系,Go语言提供的 包和 包的使用。

2 和 的关系

一种字符集,是国际标谁化组织(ISO)设计的一个包括了地球上所有文化、所有字母和符号 的编码。他们叫它 ,简称 UCS,也就是 。 为每一个 字符 分配一个唯一的 码点(Code Point),就是一个唯一的值。例如 康 的码点就是 24247,十六进制为 。

字符集仅仅定义了字符与码点的对应关系,但是并没有定义该如何编码(存储)这个码值,这就导致了很多问题。例如由于字符的码值不同,导致所需要的存储空间是不一致的,计算机不能确定接下来的字符是占用几个字节。还有就是如果采用固定的长度假设都是4个字节来存储码点值,那么会导致空间的额外浪费,因为 码字符其实仅仅需要一个字节的空间。

就是解决如何为 编码而设计的一种编码规则。可以说 是 的实现方式之一。其特点是一种变长编码,使用1到4个字节表示一个字符,根据不同的符号而变化长度。 的编码规则有二:

对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 码。因此对于ASCII码字符, 编码和 码是相同的。

对于 n 字节的符号(n > 1,2到4),第一个字节的前n位都设为1,第n + 1 位设为 0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 码。

以下是编码规则:

Go语言中,对于 Unicode 和 UTF-8 使用了 和 包来实现,下面是阅读 API 的总结和说明。

3 包

Go语言中,提供了 包,处理与 相关的操作,整理如下:

Is(rangeTab *RangeTable, r rune) bool

检测 rune r 是否在 指定的字符范围内。

一个 码值集合,通常使用 包中定义的集合。

In(r rune, ranges …*RangeTable) bool

检测 rune r 是否在多个 指定的字符范围内。

一个 码值集合,通常使用 包中定义的集合。

IsOneOf(ranges []*RangeTable, r rune) bool

检测 rune r 是否在 ranges 指定的字符范围内。与 功能类似,推荐使用 。

IsSpace(r rune) bool

检测字符 rune r 是否是空白字符。在Latin-1字符空间中,空白字符为:

其它的空白字符请参见策略Z和属性Pattern_White_Space。

IsDigit(r rune) bool

检测字符 rune r 是否是十进制数字字符。

IsNumber(r rune) bool

检测字符 rune r 是否是 数字字符。

IsLetter(r rune) bool

检测一个字符 rune r 是否是字母

IsGraphic(r rune) bool

一个字符 rune r 是否是 unicode 图形字符。图形字符包括字母、标记、数字、符号、标点、空白。

IsControl(r rune) bool

检测一个字符 rune r 是否是 unicode 控制字符。

IsMark(r rune) bool

检测一个字符 rune r 是否是标记字符。

IsPrint(r rune) bool

检测一个字符 rune r 是否是的可打印字符,基本与图形字符一致,除ASCII空白字符U+0020。

IsPunct(r rune) bool

检测一个字符 rune r 是否是 unicode标点字符。

IsSymbol(r rune) bool

检测一个字符 rune r 是否是 unicode 符号字符。

IsLower(r rune) bool

检测一个字符 rune r 是否是小写字母。

IsUpper(r rune) bool

检测一个字符 rune r 是否是大写字母。

IsTitle(r rune) bool

检测一个字符 rune r 是否是Title字符。大部分字符的 Title 格式就是其大写格式,少数字符的 Title 格式是特殊字符,例如 。

To(_case int, r rune) rune

将字符 rune r 转换为指定的格式,格式_case支持:unicode.UpperCase、unicode.LowerCase、unicode.TitleCase

ToLower(r rune) rune

将字符 rune r 转换为小写。

func (SpecialCase) ToLower

将字符 rune r 转换为小写。优先使用映射表 SpecialCase。

映射表 SpecialCase 是特定语言环境下大小写的映射表。主要应用于一些欧洲字符,例如土耳其 TurkishCase。

ToUpper(r rune) rune

将字符 rune r 转换为大写。

func (SpecialCase) ToUpper

将字符 rune r 转换为大写。优先使用映射表 SpecialCase。

映射表 SpecialCase 是特定语言环境下大小写的映射表。主要应用于一些欧洲字符,例如土耳其 TurkishCase。

ToTitle(r rune) rune

将字符 rune r 转换为 Title 字符。

func (SpecialCase) ToTitle

将字符 rune r 转换为 Title 字符。优先使用映射表 SpecialCase。

映射表 SpecialCase 是特定语言环境下大小写的映射表。主要应用于一些欧洲字符,例如土耳其 TurkishCase。

SimpleFold(r rune) rune

在 unicode 标准字符映射中查找与 rune r 互相对应的 unicode 码值。向码值大的方向循环查找。互相对应指的是同一个字符可能出现的多种写法。

4 包

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

解码 []byte p 中最后一个 UTF-8 编码序列,返回该码值和长度。

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

解码 string s 中最后一个 UTF-8 编码序列,返回该码值和长度。

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

解码 []byte p 中第一个 UTF-8 编码序列,返回该码值和长度。

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

解码 string s 中第一个 UTF-8 编码序列,返回该码值和长度。

EncodeRune(p []byte, r rune) int

将 rune r 的 UTF-8 编码序列写入 []byte p,并返回写入的字节数。p 满足足够的长度。

FullRune(p []byte) bool

检测 []byte p 是否包含一个完整 UTF-8 编码。

FullRuneInString(s string) bool

检测 string s 是否包含一个完整 UTF-8 编码。

RuneCount(p []byte) int

返回 []byte p 中的 UTF-8 编码的码值的个数。

RuneCountInString(s string) (n int)

返回 string s 中的 UTF-8 编码的码值的个数。

RuneLen(r rune) int

返回 rune r 编码后的字节数。

RuneStart(b byte) bool

检测字节 byte b 是否可以作为某个 rune 编码的第一个字节。

Valid(p []byte) bool

检测切片 []byte p 是否包含完整且合法的 UTF-8 编码序列。

ValidRune(r rune) bool

检测字符 rune r 是否包含完整且合法的 UTF-8 编码序列。

ValidString(s string) bool

检测字符串 string s 是否包含完整且合法的 UTF-8 编码序列。

完!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181027G01XKU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券