ASCII
旧时代的中文编码
GB2312
连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符。
#### GBK
**GBK** 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 干脆不再要求低字节一定是127号之后的[内码](https://www.zhihu.com/search?q=%E5%86%85%E7%A0%81&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A69732605%7D),只要第一个字节是大于127就固定表示这是一个汉字的开始。
#### GB18030
后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的[少数民族](https://www.zhihu.com/search?q=%E5%B0%91%E6%95%B0%E6%B0%91%E6%97%8F&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A69732605%7D)的字,GBK扩成了 **GB18030**。
以上的专为中文形成的标准,通称他们叫做 “**DBCS**“(Double Byte Charecter Set 双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里。
### Unicode
目前的[Unicode](https://zh.wikipedia.org/wiki/Unicode "Unicode")(Universal Coded Character Set) 字符分为17组编排,每组称为**平面**(Plane),而每平面拥有65536(即216)个代码点。
在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在[基本多文种平面](https://zh.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E6%96%87%E7%A8%AE%E5%B9%B3%E9%9D%A2 "基本多文种平面")里的所有字符,要用四个数字(即2字节,共16位,例如U+4AE0,共支持六万多个字符);在零号平面以外的字符则需要使用五或六个数字。
#### 样例var a = “01Aa我” a.charCodeAt(4) //25105
var b=25105 b.toString(16) // ‘6211’
‘\u6211’ === “我” //true
在golang中,rune将字符串拆分为多个Unicode 字符序列,而byte则将其拆分为字节序列。s := “我” log.Println([]byte(s)) log.Println([]rune(s))
2022/09/15 17:41:56 [230 136 145] 2022/09/15 17:41:56 [25105] ```
UTF-8
Unicode Transformation Format,简称为UTF
| Unicode符号范围 | UTF-8编码方式 |
|---|---|
| (十六进制) | (二进制) |
| 0000 0000-0000 007F | 0xxxxxxx |
| 0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
| 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
| 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
有时数据库倒出的表格,用excel打开是乱码,可能是没有使用 utf8-with-BOM
A BOM-ed UTF-8 string will start with the three following bytes. EF BB BF