三个阶段
- ASCII-----Dos, 1byte
- ANSI------各国语言本地化,2bytes表示一个字符。
- Unicode-----满足跨语言、跨平台
unicode , utf-8, utf-16, GB
中国人为了表示汉字,从ASCII扩充,解决常用汉字;可是汉字很多啊,于是再次扩充;还有少数民族语言,于是再扩. 后来ISO说,世界这么大,得统一一下,于是推出Unicode.
unicode
unicode 只是一种字符码表, 而在计算机中进行存储时, 必须指定一种具体的存储方式。常见的如utf8, utf16, utf32
- 比如,对于英文字符A , 在unicode中的值是65, 其在计算机中存储时, 使用utf8 utf16 utf32等不同格式存储时, 是完全不同的。
- utf8存储,在内存中就是0x41; utf16存储,在内存中就是0x0041 ; utf32存储,在内存中就是0x00000041
utf-8
UTF-8是一种变长编码,对于一个Unicode的字符被编码成1至4个字节。大部分中文使用3bytes,部分4bytes.
- 优点
UTF-8最大的优势是,没有字节序的概念。所以特别适合用于字符串的网络数据传输,不用考虑大小端问题。对于非英文网页(对于我们而言,简单说东亚文字网页),能够避免各种乱码问题。 - 缺点
对于中文等远东字符集来说,就比较坑爹了。char str[]; str[0]并不能完整表示一个汉字。UTF-8编码格式下,一个汉字需要至少3个char才能表示。这对于通过下标来操作字符串的操作来说是非常痛苦的一件事情。
一个汉字需要至少3个char来表示,也让汉字在网络传输上存在劣势,占用太多流量(但是如果启用了压缩,实际上差别并不大。并且现在很多中文网站都默认将编码从GBK改成了UTF-8)。
因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。
utf-16
UTF-16也是一种变长编码,对于一个Unicode字符被编码成1至2个码元,每个码元为16位。
- 优点:
UTF-16 LE是windows上默认的Unicode编码方式,使用wchar_t表示,常用字符都可以用16bits表示. - 缺点
UTF-16编码字符串的网络传输,要考虑大小端的问题。另外网络传输中如果一个字节信息丢失,剩下的字符串都无法正确解析。统统乱码。
utf-32
UTF-32是一种定长编码,使用1个32bit的码元,其值与Unicode编码值相等
- 优点:
这个优势就明显了,所有字符都是4字节,fix-length - 缺点
1 对于以英文为主的字符串来说,空间消耗大。
2 面临和上面UTF-16一样的问题。一致性,排序,网络传输,数据丢失后无法恢复
总结
UTF-8最适合用来作为字符串网络传输的编码格式。
UTF-16最适合当作本地字符串编码格式。如果定义好了网络传输协议,那么UTF-16也非常合适当作网络字符串传输的编码格式,特别是中文等远东地区字符集。比起UTF-8来说,节省一点点流量。
UTF-32没什么特殊癖好或者需求的话,暂时还用不上。
Linux上使用char,采用UTF-8编码。
网络传输使用UTF-8编码。
Windows上使用wchar_t / char16_t,采用UTF-16编码