【百度百科】
字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。
说明白点就是如何有效的将信息通过一种大家都能识别的方式进行传输和阅读,就好比两个人同时约定用英文、德文还是中文进行通信。而对于计算机而言,无论什么样的编码格式,在底层都是以01(或者高电平、低电平)的方式进行存储和识别。沿着计算机的发展,我们先来聊聊编码的演化过程。
【ASCII码】
在计算机发展的早期,人们发明了ASCII码编码方式,当然很大程度上是由于洋人们的信息都是由abcd26个字母、阿拉伯数字和一些符号组成,所以较为简单的使用了ASCII码编码。所谓的ASCII码就是以7位bit位存储一个字符,加一位扩展位,总共8位组成一个Byte字节。如:
Bin(二进制)
|
Oct(八进制) |
Dec(十进制)
|
Hex(十六进制)
|
缩写/字符
|
解释
|
0000 0000
|
0
|
0
|
00
|
NUL(null)
|
空字符
|
0000 0001
|
1
|
1
|
01
|
SOH(start of headline)
|
标题开始
|
0000 0010
|
2
|
2
|
02
|
STX (start of text)
|
正文开始
|
0000 0011
|
3
|
3
|
03
|
ETX (end of text)
|
正文结束
|
0000 0100
|
4
|
4
|
04
|
EOT (end of transmission)
|
传输结束
|
0000 0101
|
5
|
5
|
05
|
ENQ (enquiry)
|
请求
|
0000 0110
|
6
|
6
|
06
|
ACK (acknowledge)
|
收到通知
|
0000 0111
|
7
|
7
|
07
|
BEL (bell)
|
响铃
|
0000 1000
|
10
|
8
|
08
|
BS (backspace)
|
退格
|
0000 1001
|
11
|
9
|
09
|
HT (horizontal tab)
|
水平制表符
|
0000 1010
|
12
|
10
|
0A
|
LF (NL line feed, new line)
|
换行键
|
0000 1011
|
13
|
11
|
0B
|
VT (vertical tab)
|
垂直制表符
|
0000 1100
|
14
|
12
|
0C
|
FF (NP form feed, new page)
|
换页键
|
0000 1101
|
15
|
13
|
0D
|
CR (carriage return)
|
回车键
|
0000 1110
|
16
|
14
|
0E
|
SO (shift out)
|
不用切换
|
0000 1111
|
17
|
15
|
0F
|
SI (shift in)
|
启用切换
|
0001 0000
|
20
|
16
|
10
|
DLE (data link escape)
|
数据链路转义
|
0001 0001
|
21
|
17
|
11
|
DC1 (device control 1)
|
设备控制1
|
0001 0010
|
22
|
18
|
12
|
DC2 (device control 2)
|
设备控制2
|
0001 0011
|
23
|
19
|
13
|
DC3 (device control 3)
|
设备控制3
|
0001 0100
|
24
|
20
|
14
|
DC4 (device control 4)
|
设备控制4
|
0001 0101
|
25
|
21
|
15
|
NAK (negative acknowledge)
|
拒绝接收
|
0001 0110
|
26
|
22
|
16
|
SYN (synchronous idle)
|
同步空闲
|
0001 0111
|
27
|
23
|
17
|
ETB (end of trans. block)
|
结束传输块
|
0001 1000
|
30
|
24
|
18
|
CAN (cancel)
|
取消
|
0001 1001
|
31
|
25
|
19
|
EM (end of medium)
|
媒介结束
|
0001 1010
|
32
|
26
|
1A
|
SUB (substitute)
|
代替
|
0001 1011
|
33
|
27
|
1B
|
ESC (escape)
|
换码(溢出)
|
0001 1100
|
34
|
28
|
1C
|
FS (file separator)
|
文件分隔符
|
0001 1101
|
35
|
29
|
1D
|
GS (group separator)
|
分组符
|
0001 1110
|
36
|
30
|
1E
|
RS (record separator)
|
记录分隔符
|
0001 1111
|
37
|
31
|
1F
|
US (unit separator)
|
单元分隔符
|
0010 0000
|
40
|
32
|
20
|
(space)
|
空格
|
0010 0001
|
41
|
33
|
21
|
!
|
叹号 |
0010 0010
|
42
|
34
|
22
|
"
|
双引号 |
0010 0011
|
43
|
35
|
23
|
#
|
井号 |
0010 0100
|
44
|
36
|
24
|
$
|
美元符 |
0010 0101
|
45
|
37
|
25
|
%
|
百分号 |
0010 0110
|
46
|
38
|
26
|
&
|
和号 |
0010 0111
|
47
|
39
|
27
|
'
|
闭单引号 |
0010 1000
|
50
|
40
|
28
|
(
|
开括号
|
0010 1001
|
51
|
41
|
29
|
)
|
闭括号
|
0010 1010
|
52
|
42
|
2A
|
*
|
星号 |
0010 1011
|
53
|
43
|
2B
|
+
|
加号 |
0010 1100
|
54
|
44
|
2C
|
,
|
逗号 |
0010 1101
|
55
|
45
|
2D
|
-
|
减号/破折号 |
0010 1110
|
56
|
46
|
2E
|
.
|
句号 |
00101111
|
57
|
47
|
2F
|
/
|
斜杠 |
00110000
|
60
|
48
|
30
|
0
|
数字0 |
00110001
|
61
|
49
|
31
|
1
|
数字1 |
00110010
|
62
|
50
|
32
|
2
|
数字2 |
当时人们很快发现它的局限性,毕竟世界那么大,语言那么丰富,这最多的256个字符远不能表达人们的想法。于是乎,unicode、utf-8、gb2312、gbk、base64等等多种编码格式孕育而生。由于作者能力精力有限,只介绍几种主流的编码格式。
【unicode】
unicode又被称位统一码、万国码,原因就是因为它能收录全世界所有的语言文字符号。其原理就是将原理8位的ascii码扩张为16位,即2个字节,这样就能收录中文、日文、韩文、阿拉伯文等等所有文字,一统天下!
【java 编码】
public static void main(String[] args) { String s = "金"; char[] c = new char[1]; c = s.toCharArray(); byte[] b; try { //获取系统当前的编码格式 System.out.println(System.getProperty("sun.jnu.encoding"));; //GBK 编码 b = s.getBytes("gbk"); System.out.print("gbk:"); for (byte i : b) System.out.print(Integer.toHexString(Byte.valueOf(i)) + " "); //UTF-8 编码 b = s.getBytes("utf-8"); System.out.println(); System.out.print("utf-8:"); for (byte i : b) System.out.print(Integer.toHexString(Byte.valueOf(i)) + " "); //unicode编码 b = s.getBytes("unicode"); System.out.println(); System.out.print("unicode:"); for (byte i : b) System.out.print(Integer.toHexString(Byte.valueOf(i))+ " "); //默认为unicode System.out.println(); for (int i = 0; i < c.length; i++) { System.out.println(c[i]+":"+Integer.toHexString(c[i])); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }
输出:GBK
gbk:ffffffbd fffffff0
utf-8:ffffffe9 ffffff87 ffffff91
unicode:fffffffe ffffffff ffffff91 ffffffd1
金:91d1