💯前言在计算机科学和编程语言中,字符编码是非常重要的概念。它定义了计算机如何表示和存储文本信息。在不同的编程语言中,字符的表示方法可能有所不同。C语言使用ASCII编码表示字符,而Java则使用Unicode编码。这两者虽然都是字符编码,但它们有很大的不同,尤其是在字符集的范围、表示方法以及支持的语言字符种类等方面。
本文将详细解释ASCII和Unicode的定义、历史背景、两者之间的主要区别以及它们在C语言和Java中的应用。通过详细的分析和例子,我们将帮助读者更好地理解这两种编码标准,以及它们如何影响不同语言中的字符表示。
Java
💯一、ASCII编码详解Dec
Hex
Char
Dec
Hex
Char
Dec
Hex
Char
Dec
Hex
Char
Dec
Hex
Char
Dec
Hex
Char
0
0x00
NUL
32
0x20
(space)
64
0x40
@
96
0x60
`
128
0x80
Ç
160
0xA0
1
0x01
SOH
33
0x21
!
65
0x41
A
97
0x61
a
129
0x81
ü
161
0xA1
¡
2
0x02
STX
34
0x22
"
66
0x42
B
98
0x62
b
130
0x82
é
162
0xA2
¢
3
0x03
ETX
35
0x23
#
67
0x43
C
99
0x63
c
131
0x83
â
163
0xA3
£
4
0x04
EOT
36
0x24
$
68
0x44
D
100
0x64
d
132
0x84
ä
164
0xA4
¤
5
0x05
ENQ
37
0x25
%
69
0x45
E
101
0x65
e
133
0x85
å
165
0xA5
¥
6
0x06
ACK
38
0x26
&
70
0x46
F
102
0x66
f
134
0x86
æ
166
0xA6
¦
7
0x07
BEL
39
0x27
’
71
0x47
G
103
0x67
g
135
0x87
ô
167
0xA7
§
8
0x08
BS
40
0x28
(
72
0x48
H
104
0x68
h
136
0x88
ö
168
0xA8
¨
9
0x09
TAB
41
0x29
)
73
0x49
I
105
0x69
i
137
0x89
ù
169
0xA9
©
10
0x0A
LF
42
0x2A
*
74
0x4A
J
106
0x6A
j
138
0x8A
ú
170
0xAA
®
11
0x0B
VT
43
0x2B
+
75
0x4B
K
107
0x6B
k
139
0x8B
ñ
171
0xAB
¬
12
0x0C
FF
44
0x2C
,
76
0x4C
L
108
0x6C
l
140
0x8C
Ñ
172
0xAC
13
0x0D
CR
45
0x2D
-
77
0x4D
M
109
0x6D
m
141
0x8D
Ô
173
0xAD
14
0x0E
SO
46
0x2E
.
78
0x4E
N
110
0x6E
n
142
0x8E
Ö
174
0xAE
®
15
0x0F
SI
47
0x2F
/
79
0x4F
O
111
0x6F
o
143
0x8F
×
175
0xAF
°
16
0x10
DLE
48
0x30
0
80
0x50
P
112
0x70
p
144
0x90
Ø
176
0xB0
¨
17
0x11
DC1
49
0x31
1
81
0x51
Q
113
0x71
q
145
0x91
ø
177
0xB1
±
18
0x12
DC2
50
0x32
2
82
0x52
R
114
0x72
r
146
0x92
œ
178
0xB2
²
19
0x13
DC3
51
0x33
3
83
0x53
S
115
0x73
s
147
0x93
Œ
179
0xB3
³
20
0x14
DC4
52
0x34
4
84
0x54
T
116
0x74
t
148
0x94
ª
180
0xB4
´
21
0x15
NAK
53
0x35
5
85
0x55
U
117
0x75
u
149
0x95
º
181
0xB5
µ
22
0x16
SYN
54
0x36
6
86
0x56
V
118
0x76
v
150
0x96
û
182
0xB6
¶
23
0x17
ETB
55
0x37
7
87
0x57
W
119
0x77
w
151
0x97
Ü
183
0xB7
·
24
0x18
CAN
56
0x38
8
88
0x58
X
120
0x78
x
152
0x98
¯
184
0xB8
¨
25
0x19
EM
57
0x39
9
89
0x59
Y
121
0x79
y
153
0x99
˙
185
0xB9
¹
26
0x1A
SUB
58
0x3A
:
90
0x5A
Z
122
0x7A
z
154
0x9A
∆
186
0xBA
º
27
0x1B
ESC
59
0x3B
;
91
0x5B
[
123
0x7B
{
155
0x9B
¯
187
0xBB
»
28
0x1C
FS
60
0x3C
<
92
0x5C
\
124
0x7C
156
0x9C
∑
188
0xBC
29
0x1D
GS
61
0x3D
=
93
0x5D
]
125
0x7D
}
157
0x9D
∏
189
0xBD
½
30
0x1E
RS
62
0x3E
>
94
0x5E
^
126
0x7E
~
158
0x9E
π
190
0xBE
¾
31
0x1F
US
63
0x3F
?
95
0x5F
_
127
0x7F
DEL
159
0x9F
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种用于电子通信的字符编码标准,它为计算机系统和设备提供了一个统一的字符集。ASCII码最初由美国国家标准协会(ANSI)于1960年代制定,最初用于电传打字机。它是以7位二进制编码表示字符,其中包含了128个字符,包括英文字母、数字、标点符号以及一些控制字符(如回车、换行等)。
1.1 ASCII的组成 控制字符(0到31):这些字符通常不会在屏幕上显示出来,而是用于控制设备的行为。比如:
0 - Null字符:用于标记字符串的结束。7 - Bell:产生响铃声。10 - Line Feed(LF):换行符。13 - Carriage Return(CR):回车符。 可打印字符(32到126):这些字符可以直接显示出来,包括字母、数字、标点符号等。例如:
32 - 空格符48-57 - 数字字符(‘0’到’9’)65-90 - 大写字母(‘A’到’Z’)97-122 - 小写字母(‘a’到’z’)33 - 感叹号(!)46 - 句点(.)1.2 ASCII的局限性由于ASCII码仅使用7位编码,它的字符集仅能表示128个字符,主要包括英语字符和一些符号、控制字符。这意味着ASCII无法表示中文、日文、阿拉伯文等其他语言的字符,也无法表示诸如表情符号、数学符号等非英文字符。因此,随着全球化的需求,ASCII逐渐显示出其不足之处。
💯二、Unicode编码详解此表列出了包括 ASCII 范围内以及 Unicode 的扩展字符(如拉丁字母扩展)的一些字符。Unicode 编码表的实际内容远比这更庞大,涵盖全球几乎所有语言和符号。
Dec
Hex
Char
Dec
Hex
Char
Dec
Hex
Char
Dec
Hex
Char
Dec
Hex
Char
Dec
Hex
Char
0
0x00
NUL
32
0x20
(space)
64
0x40
@
96
0x60
`
128
0x80
Ç
160
0xA0
1
0x01
SOH
33
0x21
!
65
0x41
A
97
0x61
a
129
0x81
ü
161
0xA1
¡
2
0x02
STX
34
0x22
"
66
0x42
B
98
0x62
b
130
0x82
é
162
0xA2
¢
3
0x03
ETX
35
0x23
#
67
0x43
C
99
0x63
c
131
0x83
â
163
0xA3
£
4
0x04
EOT
36
0x24
$
68
0x44
D
100
0x64
d
132
0x84
ä
164
0xA4
¤
5
0x05
ENQ
37
0x25
%
69
0x45
E
101
0x65
e
133
0x85
å
165
0xA5
¥
6
0x06
ACK
38
0x26
&
70
0x46
F
102
0x66
f
134
0x86
æ
166
0xA6
¦
7
0x07
BEL
39
0x27
’
71
0x47
G
103
0x67
g
135
0x87
ô
167
0xA7
§
8
0x08
BS
40
0x28
(
72
0x48
H
104
0x68
h
136
0x88
ö
168
0xA8
¨
9
0x09
TAB
41
0x29
)
73
0x49
I
105
0x69
i
137
0x89
ù
169
0xA9
©
10
0x0A
LF
42
0x2A
*
74
0x4A
J
106
0x6A
j
138
0x8A
ú
170
0xAA
®
11
0x0B
VT
43
0x2B
+
75
0x4B
K
107
0x6B
k
139
0x8B
ñ
171
0xAB
¬
12
0x0C
FF
44
0x2C
,
76
0x4C
L
108
0x6C
l
140
0x8C
Ñ
172
0xAC
13
0x0D
CR
45
0x2D
-
77
0x4D
M
109
0x6D
m
141
0x8D
Ô
173
0xAD
14
0x0E
SO
46
0x2E
.
78
0x4E
N
110
0x6E
n
142
0x8E
Ö
174
0xAE
®
15
0x0F
SI
47
0x2F
/
79
0x4F
O
111
0x6F
o
143
0x8F
×
175
0xAF
°
16
0x10
DLE
48
0x30
0
80
0x50
P
112
0x70
p
144
0x90
Ø
176
0xB0
¨
17
0x11
DC1
49
0x31
1
81
0x51
Q
113
0x71
q
145
0x91
ø
177
0xB1
±
18
0x12
DC2
50
0x32
2
82
0x52
R
114
0x72
r
146
0x92
œ
178
0xB2
²
19
0x13
DC3
51
0x33
3
83
0x53
S
115
0x73
s
147
0x93
Œ
179
0xB3
³
20
0x14
DC4
52
0x34
4
84
0x54
T
116
0x74
t
148
0x94
ª
180
0xB4
´
21
0x15
NAK
53
0x35
5
85
0x55
U
117
0x75
u
149
0x95
º
181
0xB5
µ
22
0x16
SYN
54
0x36
6
86
0x56
V
118
0x76
v
150
0x96
û
182
0xB6
¶
23
0x17
ETB
55
0x37
7
87
0x57
W
119
0x77
w
151
0x97
Ü
183
0xB7
·
24
0x18
CAN
56
0x38
8
88
0x58
X
120
0x78
x
152
0x98
¯
184
0xB8
¨
25
0x19
EM
57
0x39
9
89
0x59
Y
121
0x79
y
153
0x99
˙
185
0xB9
¹
26
0x1A
SUB
58
0x3A
:
90
0x5A
Z
122
0x7A
z
154
0x9A
∆
186
0xBA
º
27
0x1B
ESC
59
0x3B
;
91
0x5B
[
123
0x7B
{
155
0x9B
¯
187
0xBB
»
28
0x1C
FS
60
0x3C
<
92
0x5C
\
124
0x7C
156
0x9C
∑
188
0xBC
29
0x1D
GS
61
0x3D
=
93
0x5D
]
125
0x7D
}
157
0x9D
∏
189
0xBD
½
30
0x1E
RS
62
0x3E
>
94
0x5E
^
126
0x7E
~
158
0x9E
π
190
0xBE
¾
31
0x1F
US
63
0x3F
?
95
0x5F
_
127
0x7F
DEL
159
0x9F
Unicode是为了解决ASCII编码的局限性而设计的一种字符编码标准。Unicode的目标是能够表示全球所有语言的字符。与ASCII仅支持英语字符不同,Unicode支持几乎所有的语言字符、符号、数学符号、表情符号、历史文献字符等。
Unicode最初由Unicode联盟于1991年发布,采用16位或更高位数的编码,可以表示更多的字符。它为每个字符分配一个唯一的码点(code point),通常用“U+”加上一个十六进制数字来表示。例如,字符"A"的Unicode码点是U+0041。
2.1 Unicode编码方式Unicode采用了不同的编码方式来表示字符,其中最常见的有三种:UTF-8、UTF-16和UTF-32。
UTF-8:一种变长编码方式,使用1到4个字节来表示字符。UTF-8与ASCII兼容,对于ASCII字符(0-127),它只使用1个字节,而对于其他字符,UTF-8则使用2到4个字节。UTF-16:通常使用2个字节(16位)表示字符,对于一些不常见的字符使用代理对(surrogate pairs)来表示。UTF-32:每个字符都使用4个字节(32位)表示,适用于内部处理,但存储效率较低。2.2 Unicode的字符范围Unicode字符集的范围非常广泛。当前版本的Unicode可以表示超过100万个字符,但实际上使用的字符还远远没有达到这个数量。Unicode字符集将字符划分为多个块,每个块包含了与特定语言、符号或用途相关的字符。例如:
基本拉丁字母:U+0000到U+007F(包括ASCII字符)拉丁扩展-A:U+0080到U+00FF汉字(CJK):U+4E00到U+9FFF表情符号:U+1F600到U+1F64F数学符号:U+2200到U+22FF💯三、ASCII与Unicode的主要区别ASCII 表(美国标准信息交换码)只有 128 个字符(从 0 到 127),其中包含了控制字符、数字、字母和常见符号。
而 Unicode 表 是一个更广泛的字符编码标准,旨在涵盖所有书写系统、符号和字符。Unicode 不仅包括 ASCII 中的字符,还包括许多其他符号、字母、汉字等字符。Unicode 是兼容 ASCII 的,在 Unicode 中,前 128 个字符与 ASCII 是相同的,但其余的字符与 ASCII 完全不同。
因此,ASCII 是 Unicode 的一个子集,但 Unicode 远比 ASCII 大得多,涵盖了更多字符。
特性
ASCII
Unicode
编码位数
7位(标准ASCII为7位,扩展ASCII为8位)
16位、32位或更大的编码(支持变长)
字符范围
128个字符(0-127)
可表示超过百万个字符
支持语言
仅支持英语字符,无法处理其他语言
支持全球多种语言(如中文、日文、韩文等)
存储效率
使用1个字节
根据编码方式不同,存储效率不一(UTF-8变长,UTF-16和UTF-32较大)
兼容性
不支持其他语言字符
完全支持ASCII,并能够兼容各种语言和符号
3.1 语言支持 ASCII:由于ASCII字符集仅包含128个字符,主要涵盖了英语字母、数字、常用符号和控制字符,因此它只能用于英文环境。对于其他语言(如中文、日文等),无法直接表示。
Unicode:Unicode支持全球几乎所有的语言字符,包括中文、日文、韩文、阿拉伯文等,甚至包括表情符号、数学符号、古代文字等。Unicode的广泛支持使其成为全球范围内的标准字符编码。
3.2 存储和编码 ASCII:每个字符仅占用1个字节(8位),因此在表示简单字符时,它的存储空间非常高效。
Unicode:由于Unicode字符集非常庞大,编码方式也相应多样化。UTF-8是变长编码,它会根据字符的需求使用1到4个字节,而UTF-16通常使用2个字节,UTF-32使用4个字节来表示一个字符。
💯四、C语言中的ASCII与Java中的Unicode4.1 C语言中的字符表示在C语言中,字符通常通过char类型表示,该类型默认使用ASCII编码。C语言的char类型通常占用1个字节,因此它只能表示ASCII字符集中的128个字符。如果要表示非ASCII字符,通常需要使用扩展的字符编码方案,例如UTF-8或UTF-16。
4.2 Java中的字符表示Java中的字符使用char类型表示,而char类型是基于UTF-16编码的。Java中的char占用2个字节(16位),因此它可以表示常用的字符,包括ASCII字符、拉丁字母、中文字符等。对于Unicode的超出基本多语言平面的字符,Java通过代理对(surrogate pairs)机制来表示。
💯总结ASCII编码适用于英文字符和一些符号,局限性较大,只能表示128个字符,适用于早期的计算机系统和简单的字符表示。Unicode提供了全球化的字符支持,能够表示所有已知语言的字符、符号和表情符号,支持不同的编码方式如UTF-8、UTF-16、UTF-32,适用于现代的跨平台编程环境。C语言使用ASCII编码表示字符,主要局限于英文字符,若要处理其他语言字符需要借助扩展编码;而Java使用Unicode(UTF-16)编码,可以直接支持多语言字符,具有更强的跨语言支持能力。通过理解ASCII和Unicode的差异及其在不同编程语言中的应用,我们可以更好地应对在全球化、多语言应用环境中的字符处理问题。
最新发布