需要区分的概念
- 码点。字符对应的数字,唯一定义字符,编码的基础。最重要的一个是Unicode,其中UCS-2子集最常用。
- 编码。字符对应的字节数组,存储传输时总是要用字节保存下来的。如utf-8,utf-16(LE|BE)。
编程语言里字符串和字节数组的区别
语言 | 字符串 | 字节数组 |
---|---|---|
C++ | char[] | |
C# | string | byte[] |
java | String | byte[] |
python | unicode | str |
c#的string,python的unicode,java的String才是字符串。他们默认是utf-16编码的。
c++里的字符串实际是字节数组。
中文编码
虽然想只了解Unicode,然而GB系列编码经常遇到。
VS默认是GB2312编码,并且没有地方设置新建文件为utf-8编码(┬_┬)。
简单记录下:
ascii
取值范围0x00-0x7f
,共128字符。
汉字不够用。没问题,有个ANSI
编码标准,只要求是编码中的ascii码要保持不变。
1980年,GB2312
扩展ascii
,有6763个汉字,682个符号,成为国家标准。
1995年,GBK
扩展GB2312
,有21886个汉字,883个符号。两个字节表示。这时微软定义的。
2000年,GB18030
扩展GBK
,包含更多汉字,加入民族语言,新加的字符有4个字节的,新的国家标准。
可以统称GB简体编码,一般GBK就够了。
ANSI
标准有个弊端,不同的编码互相冲突。
Big5是繁体字编码,与GBK就不兼容。这个时候,Unicode就来救场了。
一个特别的地方,简体字和繁体字的unicode不重叠。
收集的资料
wiki UTF-16
wiki UTF-8
彻底搞懂字符编码(unicode,mbcs,utf-8,utf-16,utf-32,big endian,little endian...)
UTF-16的特殊字符
字符编码笔记:ASCII,Unicode和UTF-8