字符编码的发展![这里写图片描述](https://img-blog.csdn.net/20180827093300229?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RhZGVsZW1vbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
ASCII编码
标准ASCII编码(0~127 7bit)
扩展ASCII编码(0~255 8bit)
UNICODE编码
❗️它并不涉及字符是怎么在字节中表示,它仅仅指定了字符对应的数字,仅此而已
❗️Unicode只是一个用来映射字符和数字的标准。它对支持的字符数量没有限制,也不要求字符必须占用两个、三个或其它任意数量的字节。
Unicode的具体编码实现是由UTF(Unicode Transformation Format)定义的
UTF编码(UCS Transfer Format)
UTF-16
使用2or4个字节编码。也是Unicode的一种具体编码实现,其常用字符都可以使用2Byte表示,其网络传输要考虑大小端问题,如果传输过程中一个字节信息丢失,剩下的字符串都无法正确解析,统统为乱码。所以其适合当做本地字符串编码格式。
‘A’0x41,大端:00 41,小端:41 00
编码规则:
• 若unicode码点在第一平面(BPM),则使用2Byte进行编码
• 若Unicode码点在其他平面(辅助平面),则使用4字节编码
UTF-8
变长编码,它可以用1~4字节表示一个符号,根据不同的符号而变化字节长度,因此他也是互联网上用得最多的一种Unicode编码规则,它是Unicode的一种具体编码实现。
编码规则:
• 对于单字节符号,字节第一位为0,后面7位为这个符号的Unicode码,对于英文字母,UTF-8编码和ASCII编码相同。
• 对于n>1字节符号,第一个字节前n位为1,n+1位为0,后面字节的前2位为10,剩下的从后至前填入Unicode(从后至前)编码
优势:
没有字节序列概念,所以特别适合用于字符串的网络数据传输,不用考虑大小端问题。对于非英文网页,能够避免各种乱码问题。
劣势:
一个汉字至少需要3字节表示,对于通过下标操作字符串的操作来说非常痛苦。并且网络传输会占用太多流量。
为什么UTF-8不需要考虑大小端问题?
因为在UTF-8编码中,其自身已经带了控制信息,如1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx,其中1110就起到了控制作用,所以不需要额外的BOM机制。
附:
Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。
你只是大致知道平面0(「Basic Multilingual Plane」,即「BMP」)的 65536 个码点(即 0x0000 至 0xFFFF)如何编码,这不是 Unicode 的全部。
• BMP 的字符是 Unicode 中最基础和最常用的一部分,以 UTF-16 编码时使用2字节,以 UTF-8 编码时使用1至3字节。
• 超出 BMP 的字符以 UTF-16 或 UTF-8 编码都需要4字节。
• 另外还有一个比较少用的编码形式,UTF-32,它编码任何 Unicode 字符都需要4个字节。
Unicode 的基础是一个编号的字符集,在字符集之上又规定了模块化的编码等等技术层次,各种具体的编码形式并不一致,你说的「Unicode 只有两个字节」这句话根本不成立。