一次性分清UTF-8 & Unicode&ASCII及go中runes的使用

269 阅读2分钟

以下内容来自:这里

Unicode 与 ASCII 类似,都是一种字符集。字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如上面例子中的 a 在 Unicode 与 ASCII(ascii码是指一些常见的字符,a-z,A-Z,0-9之类的)中的编码都是 97。汉字“你”在 Unicode 中的编码为 20320,在不同国家的字符集中,字符所对应的 ID 也会不同。而无论任何情况下,Unicode 中的字符的 ID 都是不会变化的。
UTF-8 是编码规则,将 Unicode 中字符的 ID 以某种方式进行编码,UTF-8 的是一种变长编码规则,从 1 到 4 个字节不等。编码规则如下:

  • 0xxxxxx 表示文字符号 0~127,兼容 ASCII 字符集。
  • 从 128 到 0x10ffff 表示其他字符。

根据这个规则,拉丁文语系的字符编码一般情况下每个字符占用一个字节,而中文每个字符占用 3 个字节。
广义的 Unicode 指的是一个标准,它定义了字符集及编码规则,即 Unicode 字符集和 UTF-8、UTF-16 编码等。
搬运结束

go中处理字符

golang的字符称为rune,等价于C中的char,可直接与整数转换。

p := "你好,你好"
fmt.Println(len(p))
for _, v := range p {
fmt.Println(v)
}

结果输出为

13
20320
22909
44
20320
22909

长度13肯定是不对的,默认打印也不应该是数字。这个时候就要用runes了,来,整活!走,忽咧(似声词)!

func main() {
    p := "你好,你好"
    fmt.Println(len([]rune(p)))
    for _, v := range p {
        fmt.Printf("%c\n", v)
    }
}

输出:

5
你
好
,
你
好

unicode包有有一些方法,可以进行操作。

图片.png