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"