编码问题

本文详细介绍了Unicode编码及其与UTF-8、UTF-16、UTF-32的关系和优劣。UTF-8适合网络传输,无字节序问题;UTF-16是Windows默认的Unicode编码,适用于本地存储;UTF-32则因为固定长度在某些场景下不常见。
摘要由CSDN通过智能技术生成

三个阶段

  1. ASCII-----Dos, 1byte
  2. ANSI------各国语言本地化,2bytes表示一个字符。
  3. Unicode-----满足跨语言、跨平台

unicode , utf-8, utf-16, GB

中国人为了表示汉字,从ASCII扩充,解决常用汉字;可是汉字很多啊,于是再次扩充;还有少数民族语言,于是再扩. 后来ISO说,世界这么大,得统一一下,于是推出Unicode.

源自zhihu

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编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值