1、go的编码方式

byte 等同于int8,即1Byte长度,常用来处理ascii字符。若要表示utf-8需要用byte数组。

  • ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)

rune 等同于int32,即4Byte长度,常用来处理unicode或utf-8字符。长4B可直接存储Unicode。

  • utf-8:英文是1Byte,中文是3Byte,emoji是4Byte。golang默认编码正好是utf-8。
  • unicode:英文是1Byte,中文是2Byte。

2、GO代码实现判断字符编码格式及编码格式转换(utf-8、gbk)

参考:https://studygolang.com/articles/24702?fr=sidebar

	c := '我' // rune默认存的是Unicode码,即0x6211,这里是15位。
	fmt.Printf("Rune直接是Unicode编码最长2Byte:%T, %d, %x, %b \n", c, c, c, c) // int32, 25105, 6211, 110001000010001
	str := "我" // byte[]存储的是utf-8码,按照编码公式对Unicode二次编码,即0xe68891,三字节是一个汉字。
	d := []byte(str)
	fmt.Printf("%T, %d, %x, %b \n", d, d, d, d) // []uint8, [230 136 145], e68891, [11100110 10001000 10010001]
	gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str)) //utf-8 转 gbk, Enoder
	fmt.Println("gbk直接打印会出现乱码:", string(gbkData))                       //乱码字符串
	fmt.Printf("gbk编码:%T, %d, %x, %b \n", gbkData, gbkData, gbkData, gbkData) // []uint8, [206 210], ced2, [11001110 11010010
	utf8Data, _ := simplifiedchinese.GBK.NewDecoder().Bytes(gbkData) //gbk 转 utf-8, Decoder
	// fmt.Println("is UTF-8:", isUtf8(utf8Data))
	fmt.Printf("utf8打印不乱码:%T, %d ,%x ,%b \n", utf8Data, utf8Data, utf8Data, utf8Data)
汉字 GBK Unicode UTF-8
0Xced2(2B) 0x6211(2B) 0xe68891(3B)

声明方式 go存储类型 编码
str := "我"
b := byte[](str)
string转为byte[] UTF-8:0xe68891
c := '我' rune Unicode:0x6211

3、CR vs LF

  • \n是换行,英文是line feed,ASCII码是0x0A。
    \r是回车,英文是carriage return ,ASCII码是0x0D。
  • Unix系统里,每行结尾只有“<换行>”,即"\n"
    Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”(此处顺序一定不能颠倒了!!!)
    Mac系统里,每行结尾是“<换行>”,即"\n"
posted on 2022-01-07 18:31  西伯尔  阅读(1561)  评论(0编辑  收藏  举报