🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> ### Unicode字符编码 * Unicode(字符集) : 为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point * UTF-8(编码规则) : 将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)- 以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节 * Go 语言的所有源代码,都必须按照 Unicode 编码规范中的 UTF-8 编码格式进行编码 * UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节。 * Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节。 > ### byte and rune * 一个rune类型的值在底层其实就是一个 UTF-8 编码值 ~~~ package main import "fmt" func main() { //type byte = uint8 不带符号8位 //type rune = int32 带符号32位 str := "Hello! 一二三" strlist1 := []byte(str) strlist2 := []rune(str) //go中的字符串底层默认是[ ]byte形式存储的 fmt.Println(len(str)) //UTF-8编码:一个中文字符等于三个字节,显然一个uint8无法存储三个字节 fmt.Println(strlist1) fmt.Printf("byte:%s---%d---%b\n", string(strlist1), len(strlist1), strlist1) fmt.Println(strlist2) fmt.Printf("rune:%s---%d---%b\n", string(strlist2), len(strlist2), strlist2) } ~~~ > ### 循环取值 ~~~ package main import "fmt" func main() { //type byte = uint8 不带符号8位 //type rune = int32 带符号32位 str := "Hello! 一二三" //出错 for i := 0; i < len(str); i++ { fmt.Print(string(str[i])) } fmt.Println() strlist2 := []rune(str) for i := 0; i < len(strlist2); i++ { fmt.Print(string(strlist2[i])) } fmt.Println() for _, v := range str { fmt.Print(string(v)) } } ~~~ > ### 相关阅读 * [Unicode 和 UTF-8 有什么区别?](https://www.zhihu.com/question/23374078) * [WideString 还是 AnsiString](https://blog.csdn.net/hksoobe/article/details/31248835) * Go还定义了三个依赖系统的类型,uint,int和uintptr。因为在32位系统和64位系统上用来表示这些类型的位数是不一样的。 * 对于32位系统 * uint=uint32 * int=int32 * uintptr为32位的指针 * 对于64位系统 * uint=uint64 * int=int64 * uintptr为64位的指针