跳转至

字节数据 字符编码

时间:2018-12-25 16:01:20

参考:

  1. 字符编码笔记:ASCII,Unicode 和 UTF-8
  2. 汉字编码表
  3. 程序员趣味读物:谈谈Unicode编码

字符编码#

ASCII 编码#

使用 8bit 表示范围从 00000000~11111111 可以表示 256 种字符,标准ASCII码定义了 128 个字符,从 00000000~01111111

字符组成:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
```
[0,32]:       不可见字符(回车、换行和制表符)
[33,47]:      [! " # $ % & ' ( ) * + , - . /]
[48,57]:      [0 1 2 3 4 5 6 7 8 9]
[58,64]:      [: ; < = > ? @]
[65,90]:      [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
[91,96]:      [[ \ ] ^ _ `]
[97,122]:     [a b c d e f g h i j k l m n o p q r s t u v w x y z]
[123,128]:    [{ | } ~  €]
```

Unicode 编码#

全称:Universal Multiple-Octet Coded Character Set。 简称 UCS。

ASCII 编码最多只能表示256个字符,[0~128]是固定的编码,[129~256] 在不同的国家可能对应不同的编码。

汉字一种语言有几万个字,为了使所有国家的每一个字都对应一个编码,就出现了 Unicode 编码。Unicode 编码 用4个字节表示一个字符。Unicode 规范了怎么用编码表示字符。

Unicode 编码存在的一个问题:

  • 用几个字节存储字符,没有统一规定。
  • 表示 abc 这些字符需要3个字节,比ASCII多出了3倍的空间。

对于上面的原因就出现了几种 Unicode 的规范,比如 UTF-8、UTF-32 等。

UTF-8 编码#

UTF:全称:UCS Transformation Format。定义了编码怎么传输。

使用可变长度(1~4个字节)编码表示不同符号,编码规则如下:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

  • 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

1
2
3
4
5
6
7
8
9
```
Unicode符号范围      |        UTF-8编码方式
(十六进制)           |          (二进制)
----------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\
```