go rune与byte

rune 与 byte类型转换时是否需要重新分配内存呢?
首先了解下两者的定义

  • rune是一个int32的别名,通常用来处理unicode或utf8字符
  • byte等同于int8,常用来处理字符
1
2
3
4
5
6
7
8
9
10
runePresent:=[]rune("你")
fmt.Printf("%x %#U %d",runePresent,runePresent,len(runePresent))
fmt.Println()
bytePresent:=[]byte("你")
fmt.Printf("%x %#U %d",bytePresent,bytePresent,len(bytePresent))
fmt.Println()
//输出
[4f60] [U+4F60 '你'] 1
e4bda0 [U+00E4 'ä' U+00BD '½' U+00A0] 3

可以看到rune与byte的存储不同的,所以rune与byte相互想换必然伴随着内存分配

如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是 Unicode,就像它的名字都表示的,这是一种所有符号的编码。

需要注意的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一

unicode=>utf8流程

首先找到字符对应的unicode编码,然后根据utf8存储规则进行转换

utf8与unicode