golang 字符类型 与 Unicode

一. golang中的字符类型

在golang一共存在3种字符类型: string []byte 和 []rune 

1. 其中string最好理解,就是字面含义上的字符, 如

s := "字"

2. []rune代表的则是字符的unicode编码值, 如

r :=  []rune("字")
fmt.Print(r)

我们会发现打印出的结果是 [23383], 这个就是汉字 “字” 的Unicode编码值的10进制表达

如果转换成16进制的结果是5B57, 就是我们常见的 

hex := "\u5B57"
fmt.Print(hex) //输出“字”

3.[]byte代表的是按照utf-8格式对字符的unicode值进行编码后的结果

s := "字"
fmt.Println([]byte(s))

输出的结果[229 173 151], 我们将这个结果转化成 2进制则是 ①[11100101, 10101101, 10010111]

我们来对照一下utf-8编码规则:如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节,

Unicode    Utf-8
000000-00007F 0xxxxxxx
000080-0007FF    110xxxxx 10xxxxxx
000800-00FFFF    1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF    11110xxx10xxxxxx10xxxxxx10xxxxxx

我们之前得到了“字”的unicode值u5B57, 位于第三行,utf-8编码后的结果是[1110xxxx 10xxxxxx 10xxxxxx]

我们再把unicode值转成2进制结果为101101101010111,从后往前依次替换x,不足部分补0

得到 ②[11100101 10101101 10010111]  正是①输出的结果

二. Unicode 与 UTF-8

Unicode 为每一个字符规定了一个唯一值, 通常标准的字符都位于 \u0000到\uFFFF 65536个值, 当仍可以继续扩充

但是计算机存储通常以字节为单位, 一个字节最多只能记录 0-255, 像“字“的unicode值23383 只能通过多个字节存储

UTF-8 提供的便是如何将一个unicode值转换成多个字节的规则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值