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



相关推荐
一勺菠萝丶9 分钟前
Spring Boot + MyBatis/MyBatis Plus:XML中循环处理List参数的终极指南
xml·spring boot·mybatis
RainbowSea2 小时前
问题:后端由于字符内容过长,前端展示精度丢失修复
java·spring boot·后端
风象南2 小时前
SpringBoot 控制器的动态注册与卸载
java·spring boot·后端
我是一只代码狗2 小时前
springboot中使用线程池
java·spring boot·后端
hello早上好2 小时前
JDK 代理原理
java·spring boot·spring
PanZonghui3 小时前
Centos项目部署之运行SpringBoot打包后的jar文件
linux·spring boot
沉着的码农3 小时前
【设计模式】基于责任链模式的参数校验
java·spring boot·分布式
zyxzyx6663 小时前
Flyway 介绍以及与 Spring Boot 集成指南
spring boot·笔记
一头生产的驴5 小时前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
程序员张37 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端