ASCII 与 Unicode:两种字符编码的定义和不同



博客主页:[小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java


文章目录



💯前言

  • 在计算机科学和编程语言中,字符编码是非常重要的概念。它定义了计算机如何表示和存储文本信息。在不同的编程语言中,字符的表示方法可能有所不同。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-8UTF-16UTF-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中的Unicode

4.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的差异及其在不同编程语言中的应用,我们可以更好地应对在全球化、多语言应用环境中的字符处理问题。



相关推荐
典龙3309 小时前
如何使用springboot项目如何实现小程序里面商品的浏览记录功能案例
spring boot
customer0810 小时前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
qq_4592384910 小时前
SpringBoot整合Redis和Redision锁
spring boot·redis·后端
灰色人生qwer10 小时前
SpringBoot 项目配置日志输出
java·spring boot·后端
2301_7930698210 小时前
Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
java·数据库·spring boot·sql·jdbc·orm
Earth explosion10 小时前
Spring Boot:开启快速开发新时代
spring boot
hhw19911211 小时前
spring boot知识点5
java·数据库·spring boot
customer0811 小时前
【开源免费】基于SpringBoot+Vue.JS打卡健康评测系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
ONEPEICE-ing12 小时前
快速入门Springboot+vue——MybatisPlus多表查询及分页查询
前端·vue.js·spring boot·mybatis
paterWang12 小时前
基于SpringBoot的驾校报名小程序系统设计与实现(源码+文档)
spring boot·后端·小程序