Unicode/UTF-8 编码以及其他
一、计算机编码
计算机处理的数据是二进制的0和1(高低电平两种状态),然后通过组合达到表示特定字符的作用,这个组合的过程就是编码。反之将组合解释成字符的过程就是解码。 计算机在美国诞生,所以一开始只用8位(1个字节byte)组合,总计256种,并制定了标准:American Standard Code for Information Interchange(美国标准信息交换代码,简写为ASCII)。 在实际的使用过程中,第一个bit始终是0,剩下的7位足够英文字符使用。
随着计算机技术的发展,英文国家以外的比如西班牙、希腊等国家需要一些特别的字符,比如:西班牙语(Español)中的ñ。于是就把第一位bit利用了起来,制定了ISO标准。 该标准兼容ASCII。
等到了中国以及其他亚洲国家,8位就不够用了,于是就有了2个byte表示1个汉字的编码标准,成为GB2312。(后来变成1xxxxxxx,xxxxxxxx的GBK标准,可以兼容GB2312)
这里可以注意到,所有的编码都试图兼容ASCII,但都不考虑互相兼容。这些编码标准统称为ASCI,又称MBCS(Muilti-Bytes Charecter Set,多字节字符集。 互联网的发展,推进了编码标准的统一。考虑到所有字符集都不兼容,所以推出了Unicode编码,即万国码。
二、Unicode/UTF-8
Unicode范围包括U+0000至U+007F,即4byte。
UTF-8是Unicode标准的一种实现,现在是互联网最流行的编码标准。
三、Big/ Little Endian
大端(Big Endian)和小端(Little Endian)是CPU不同架构处理多字节数的不同方式。 Big-Endian和Little-Endian的定义如下:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
例如“汉”字的Unicode编码是6C49。 那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。
四、其他
在Stackvoerflow上看到有人问Base64和UTF-8/Unicode的差别, 这个答案其实很简单,Base64是对二进制的编码,是数据流的表达方式(二进制显示成字符串的编码),在互联网加解密传输基本都是Base64格式。 原因是对二进制的解码有很多标准,不同的编程语言都有自己的默认方式,但如果转成ASCII范围内的Base64编码,那么大家都统一了。 而Unicode是字符集编码标准。 这两个是不同的概念。
Authors and Contributors
Qiqidone (@qiqidone) can be founded GitHub.