-
Notifications
You must be signed in to change notification settings - Fork 13
/
golang.org.x.text.go
62 lines (56 loc) · 3.31 KB
/
golang.org.x.text.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package main
import (
"bytes"
"fmt"
"golang.org/x/text/encoding/simplifiedchinese"
"io/ioutil"
"log"
)
func main() {
//编码unicode成为GB18030码
enc := simplifiedchinese.GB18030.NewEncoder()//申明一个编码器(相对于unicode来说确实是编码)
encBuf := bytes.NewBuffer(make([]byte, 0))//申明一个encBuf来存储转换后的原生字节
// 序列(无任何编码的遵循unicode协议的字节序列,他是unicode值,但是unicode不是一种编码,而是一种规范和协议)
// Writer包装另一个Writer对其UTF-8输出进行编码。
//只要使用了返回的Writer,编码器就不能用于任何其他操作。
writ := enc.Writer(encBuf)//申明一个对接encBuf缓存的写入器,这个写入器是由编码器生成的,
// 因此它具有编码的功能, 在这儿是把GB18030转成原生字节的转码器
writ.Write([]byte("这段内容是要被编码转换"))//把一个原生字节序列或者叫unicode字符串经过
// 写入器(内含GB18030编码器)写入到encBuf缓存容器中去,此时缓存容器里面存的是GB18030编码后的
//字节序列
fmt.Println(encBuf)//这个是buf类型
fmt.Println(encBuf.Bytes())//转成字节类型才能打印
fmt.Println("编码后的内容", encBuf.String())//String()是对缓存容器里面的原生字节序列进行go内置的utf8解码
//并且打印出utf8字符串,但是由于他是GB18030值,而go却采用的是utf8的解码器去解码,所以不会成功打印的!
//--------------------------------------------------------------
//解码GB18030成为unicode之后再编码成为utf8
dec := simplifiedchinese.GB18030.NewDecoder()//声明一个解码器(相对于unicode来说确实是解码)
read := dec.Reader(encBuf) //跟上面一样写入缓存需要一个写入器,读出缓存也需要一个读取器来读取缓存容器里面的内容
decBuf, err := ioutil.ReadAll(read)//上面说到编码器写入到缓存容器中,这时候解码器需要从
//缓存容器中读取GB18030字节序列出来,并且返回新的字节切片
if err != nil {
log.Println(err)
}
fmt.Println(decBuf)//[232 191 153 230 174 181 229 134 133 229 174 185 230 152 175 232 166 129 232 162
// 171 231 188 150 231 160 129 232 189 172 230 141 162]
fmt.Println("解码后的内容", string(decBuf))//跟上面string函数一样
//缩写方式1如下:
//reader := simplifiedchinese.GB18030.NewDecoder().Reader(resp.Body)
//buf, err := ioutil.ReadAll(reader)
//中级缩写方式2如下:
////utf8转gbk
//src:="编码转换内容内容"
////src:=[]byte{78, 45, 86, 253, 78, 186}//unicode码值
//fmt.Println(src)
//fmt.Println([]byte(src))//[231 188 150 231 160 129 232 189 172 230 141
//// 162 229 134 133 229 174 185 229 134 133 229 174 185]
////每3个字节为一个中文字,这是典型的utf8编码后的字节序列
//
////将utf8的字节序列转化为gbk的字节序列
//data, _ := ioutil.ReadAll(transform.NewReader(bytes.NewReader([]byte(src)), simplifiedchinese.GBK.NewEncoder()))
////[177 224 194 235 215 170 187 187 196 218 200 221 196 218 200 221]
////每2个字节为一个中文字
//fmt.Println(data) //byte
////因为他采用的是utf8来解码序列了,很明显这是gbk才能解码的序列
//fmt.Println(string(data)) //打印为乱码:����ת����������
}