关于 Unicode 每个程序员应该知道的 5 件事
969
2022-05-29
ASCII
简介
ASCII(American Standard Code for Information Interchange-美国信息交换标准代码),是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,到目前为止定义了128个字符。
产生原因
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如52个英文字母、1-9的数字、常用的一些字符在计算机中存储时也需要使用二进制来表示,而具体使用什么样的二进制来表示,不同的人有不同的约定,而为了达到相互通信而不造成混乱的目的,大家就必须使用统一的编码规则,于是美国国家标准学会(American National Standard Institute, ANSI)就制定了ASCII编码,ASCII编码统一规定了上述符合用哪些二进制数来表示。
表达方式
ASCII码使用指定的7位或者8位二进制数组合来表示128种或者256种可能的字符,标准ASCII码也叫基础ASCII码,使用7位二进制数(剩余一位二进制为0)来表示所有的大些和小写字母、数组0-9、其他字符以及美式英语中使用的椰树控制字符。
标准表
十进制
缩写/字符
说明
0
NUL(null)
空字符
1
SOH(start of headline)
标题开始
2
STX (start of text)
正文开始
3
ETX (end of text)
正文结束
4
EOT (end of transmission)
传输结束
5
ENQ (enquiry)
请求
6
ACK (acknowledge)
收到通知
7
BEL (bell)
响铃
8
BS (backspace)
退格
9
HT (horizontal tab)
水平制表符
10
LF (NL line feed, new line)
换行键
11
VT (vertical tab)
垂直制表符
12
FF (NP form feed, new page)
换页键
13
CR (carriage return)
回车键
14
SO (shift out)
不用切换
15
SI (shift in)
启用切换
16
DLE (data link escape)
数据链路转义
17
DC1 (device control 1)
设备控制1
18
DC2 (device control 2)
设备控制2
19
DC3 (device control 3)
设备控制3
20
DC3 (device control 4)
设备控制4
21
NAK(negative acknowledge)
拒绝接受
22
SYN(synchronous idle)
同步空闲
23
ETB (end of trans. block)
结束传输块
24
CAN (cancel)
取消
25
EM (end of medium)
媒介结束
26
SUB (substitute)
代替
27
ESC (escape)
换码(溢出)
28
FS (file separator)
文件分隔符
29
GS (group separator)
分组符
30
RS (record separator)
记录分隔符
31
US (unit separator)
单元分隔符
32
(space)
空格
33
!
叹号
34
"
双引号
35
#
井号
36
$
美元符
37
%
百分号
38
&
和号
39
'
闭单引号
40
(
开括号
41
)
闭括号
42
*
星号
43
+
加号
44
,
逗号
45
-
减号/破折号
46
.
句号
47
/
斜杆
48
0
字符0
49
1
字符1
50
2
字符2
51
3
字符3
52
4
字符4
53
5
字符5
54
6
字符6
55
7
字符7
56
8
字符8
57
9
字符9
58
:
冒号
59
;
分号
60
<
小于
61
=
等于
62
>
大于
63
?
问号
64
@
电子邮件符号
65
A
大写字母A
66
B
大写字母B
67
C
大写字母C
68
D
大写字母D
69
E
大写字母E
70
F
大写字母F
71
G
大写字母G
72
H
大写字母H
73
I
大写字母I
74
J
大写字母J
75
K
大写字母K
76
L
大写字母L
77
M
大写字母M
78
N
大写字母N
79
O
大写字母O
80
P
大写字母P
81
Q
大写字母Q
82
R
大写字母R
83
S
大写字母S
84
T
大写字母T
85
U
大写字母U
86
V
大写字母V
87
W
大写字母W
88
X
大写字母X
89
Y
大写字母Y
90
Z
大写字母Z
91
[
开括号
92
\
反斜杠
93
]
闭开括号
94
^
脱字符
95
_
下划线
96
`
开单引号
97
a
小写字母a
98
b
小写字母b
99
c
小写字母c
100
d
小写字母d
101
e
小写字母e
102
f
小写字母f
103
g
小写字母g
104
h
小写字母h
105
i
小写字母i
106
j
小写字母j
107
k
小写字母k
108
l
小写字母i
109
m
小写字母m
110
n
小写字母n
111
o
小写字母o
112
p
小写字母p
113
q
小写字母q
114
r
小写字母r
115
s
小写字母s
116
t
小写字母t
117
u
小写字母u
118
v
小写字母v
119
w
小写字母w
120
x
小写字母x
121
y
小写字母y
122
z
小写字母z
123
{
开花括号
124
|
垂线
125
}
闭花括号
126
~
波浪号
127
DEL (delete)
删除
问题
在英语中,使用128个符号编码便可以表示所有,但是用来表示其他语言,128个符号是不够的。比如,在法语中字母上方有注音符号,它就无法使用ASCII码表示。因此,部分欧洲国家使用字节中闲置的最高位编入新的符号,最多可以表示256个字符,但是,256个字符对于字符超出这个数字的国家就不适用了,比如中国的汉字统计多大10万左右。一个字节最多只能表示256个字符,肯定是不够,要想解决这个问题,就必须使用多个字节表达一个符号。
Unicode
简介
统一码,也称万国码、单一码(Unicode)是计算机领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
编码方式
Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符/码位。码位就是可以分配给这些字符的数字。UTF-8、UTF-16、UTF-32都是讲这些数字转换到程序数据的编码方案。
Unicode字符集早期的标准有UCS-2、UCS-4的说法。UCS-2用2个字节编码,UCS-4用4个字节编码。UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个平面(plane)。每个平面根据第3个字节分为256行(row),每行有256个码位(cell)。group 0的平面0被称为BMP(Basic Multilingual Plance)。将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。
每个平面有2^16=65536个码位。Unicode计划使用了17个平面,一共16*65526=1114114个码为。在Unicode5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15个平面16只是定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。所谓专区就是保留给大家放自定义字符的区域,简写PUA。
实现方式
在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码
WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码
DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码
这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。“汉字”的UTF-8编码需要6个字节。“汉字”的UTF-16编码需要两个WORD,大小是4个字节。“汉字”的UTF-32编码需要两个DWORD,大小是8个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。
UTF-8
简介
UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任意字符,而且其编码中的第一个字节仍然与ASCII相容,使得原先处理ASCII字符的软件无需或者只需要进行少部分的修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
编码字节数
UTF-8使用1-4字节为每个字符编码:
一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
其他极少使用的语言字符使用4字节编码。
字符集
编码方式
16进制编码
UTF8-1
\x00-\x7F
UTF8-2
\xC2-\xDF \x80-\xBF
UTF8-3
\xE0 \xA0-\xBF \x80-\xBF
\xE1-\xEC \x80-\xBF \x80-\xBF
\xED \x80-\x9F \x80-\xBF
\xEE-\xEF \x80-\xBF \x80-\xBF
UTF8-4
\xF0 \x90-\xBF \x80-\xBF \x80-\xBF
\xF1-\xF3 \x80-\xBF \x80-\xBF \x80-\xBF
\xF4 \x80-\x8F \x80-\xBF \x80-\xBF
总结
对比
编码
大小
支持语言
ASCII
1个字节
英文
Unicode
2个字节(生僻字4个字节)
所有语言
UTF-8
1-6个字节,英文1个字节、汉子3个字节、生僻字4-6个字节
所有语言
计算机系统通用的字符编码方式
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码
场景一:
用记事本编辑文本时,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件中。
场景二:
浏览网页时,服务会把动态生成的Unicode内容转换为UTF-8再传输给浏览器。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。