View on GitHub

Qiqidone

He that breaks a thing to find out what it is has left the path of wisdom.

Unicode/UTF-8 编码以及其他

一、计算机编码

计算机处理的数据是二进制的0和1(高低电平两种状态),然后通过组合达到表示特定字符的作用,这个组合的过程就是编码。反之将组合解释成字符的过程就是解码。 计算机在美国诞生,所以一开始只用8位(1个字节byte)组合,总计256种,并制定了标准:American Standard Code for Information Interchange(美国标准信息交换代码,简写为ASCII)。 在实际的使用过程中,第一个bit始终是0,剩下的7位足够英文字符使用。

随着计算机技术的发展,英文国家以外的比如西班牙、希腊等国家需要一些特别的字符,比如:西班牙语(Español)中的ñ。于是就把第一位bit利用了起来,制定了ISO标准。 该标准兼容ASCII。

  • 1) 0-127不动
  • 2)128-255用以编码新字符
  • 等到了中国以及其他亚洲国家,8位就不够用了,于是就有了2个byte表示1个汉字的编码标准,成为GB2312。(后来变成1xxxxxxx,xxxxxxxx的GBK标准,可以兼容GB2312)

  • 1) 0-256不动,0xxxxxxx
  • 2) 2byte汉字1xxxxxxx,1xxxxxxx
  • 这里可以注意到,所有的编码都试图兼容ASCII,但都不考虑互相兼容。这些编码标准统称为ASCI,又称MBCS(Muilti-Bytes Charecter Set,多字节字符集。 互联网的发展,推进了编码标准的统一。考虑到所有字符集都不兼容,所以推出了Unicode编码,即万国码。

    二、Unicode/UTF-8

    Unicode范围包括U+0000至U+007F,即4byte。

  • 1) 128个US-ASCII字符只需一个字节编码。
  • 2) 带有附加符号的拉丁文、希腊文等则需要两个字节编码。
  • 3) 其他基本多文种平面(BMP)中的字符(大部分的汉字)使用三个字节编码。
  • 4) 其他极少使用的Unicode,辅助平面的字符使用四至六字节编码。
  • UTF-8是Unicode标准的一种实现,现在是互联网最流行的编码标准。

    三、Big/ Little Endian

    大端(Big Endian)和小端(Little Endian)是CPU不同架构处理多字节数的不同方式。 Big-Endian和Little-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.

    Index

    首页