程序将 ASCII 转换为 Unicode(C++)

2025年1月12日 | 阅读 6 分钟

在编程中,两种常用的字符编码系统是ASCIIUnicode。Unicode 可以表示超过 100,000 个字符,使用从 0 到0x10FFFF的代码点,而 ASCII 只能用 7 位表示 128 个字符。在 C++ 中处理或显示不在 ASCII 范围内的字符时,将 ASCII 字符代码转换为相应的 Unicode 代码点有时很有帮助。本文将介绍一个基本的 C++ 程序,该程序将用户输入的 ASCII 代码转换为合适的 Unicode 字符。我们将直接将 ASCII 值映射到 Unicode 代码点,这对于 0-127 的标准 ASCII 范围是有效的。完整的代码示例展示了如何用几行 C++ 实现此转换,为应用程序中更强大的 Unicode 处理提供基础。

什么是 ASCII 码?

名为ASCII (American system Code for Information Interchange,美国信息交换标准代码)的字符编码系统使用七位来编码 128 个字符。它在1960 年代创建时基于英语字母。

ASCII 中的字符集编码

  • 英语中的大写和小写字母 (A-Z, a-z)。
  • 数字 0 到 9。
  • 标点符号。
  • 控制字符:换行符、回车符等。
  • 特殊符号,例如 !"#$%&'()*+,-./:;<=>?@[]^_}{|}~。

从 0000000 到 1111111 的二进制数,可以方便地表示为 0 到 127 之间的十进制值,对应于每个字符。例如:

  • 二进制 0100001,或十进制 65,对应于'A'
  • 而二进制 01000010,或十进制 66,对应于 'B'。

前 32 个 ASCII 码 (十进制 0-31) 保留给不可打印的控制字符,如空字符、制表符、换行符、回车符等。码位 32-126 表示可打印字符,如字母、数字和标点符号。码位 127 保留给删除字符。

ASCII 标准每个字符只使用7 位,但大多数现代系统使用 8 位并将最高位设置为 0。这使得 ASCII 可以在 8 位环境中与其他编码一起使用。

什么是 Unicode?

Unicode 是一项在大多数书写系统中通用的计算行业标准,可确保一致的编码、表示、处理和文本处理。无论平台如何,Unicode 为每个字符分配一个唯一的数字、应用程序或语言。

关于 Unicode 的几点说明

  • Unicode 使文本处理、存储和传输独立于语言和平台。
  • Unicode 标准可以编码超过 100 万个字符。它包含世界上所有主要语言的字符。
  • Unicode 使用 21 位的编码空间来定义 1,112,064 个代码点。每个代码点代表一个唯一的字符。
  • 21 位空间被划分为 17 个平面,每个平面有 65,536 (= 2^16) 个代码点。第一个平面 (0000 - F) 称为基本多语言平面 (BMP),包含几乎所有现代语言的字符。
  • Unicode 拥有双向文本、字形、排序和渲染标准,以促进国际化。
  • Unicode 联盟是一个非营利组织,负责维护 Unicode 标准。各大公司和组织都参与 Unicode 标准的制定。
  • Unicode 与设备和平台无关。Unicode 代码点表示的字符将在不同设备上一致地呈现。
  • Unicode 向后兼容 ASCII。前 128 个 Unicode 代码点对应于 ASCII 字符。

什么是 ASCII 字符表?

ASCII 表是一种字符编码标准,使用 7 位二进制数表示 128 个字符。ASCII 是 American Standard Code for Information Interchange (美国信息交换标准代码) 的缩写。

ASCII 表包含:

  • 大写和小写英文字母
  • 数字
  • 标点符号
  • 控制字符
  • 特殊字符

每个 ASCII 字符都映射到一个介于 0 和 127 之间的十进制数。它允许使用从 0000000 到 1111111 的二进制数来编码字符。

前 32 个 ASCII 码 (0-31) 保留给不可打印的控制功能字符,如空字符、制表符、换行符、回车符等。

  • 码位 32 到 47 表示各种标点符号。
  • 码位 48 到 57 表示数字 0 到 9。
  • 码位 65 到 90 是大写字母 A 到 Z。
  • 码位 97 到 122 是小写字母 a 到 z。

其余码位用于其他符号和控制字符。下面是完整的 ASCII 标准表,显示了每个字符及其对应的十进制和十六进制码值:

十进制十六进制Character
000NUL (空字符)
101SOH (标题开始)
202STX (文本开始)
303ETX (文本结束)
404EOT (传输结束)
505ENQ (询问)
606ACK (确认)
707BEL (响铃)
808BS (退格)
909TAB (水平制表符)
100ALF (换行)
110BVT (垂直制表符)
120CFF (换页)
130DCR (回车)
140ESO (移出)
150FSI (移入)
1610DLE (数据链路转义)
1711DC1 (设备控制 1)
1812DC2 (设备控制 2)
1913DC3 (设备控制 3)
2014DC4 (设备控制 4)
2115NAK (否定确认)
2216SYN (同步空闲)
2317ETB (传输块结束)
2418CAN (取消)
2519EM (介质结束)
261ASUB (替换)
271BESC (转义)
281CFS (文件分隔符)
291DGS (组分隔符)
301ERS (记录分隔符)
311FUS (单元分隔符)
3220(空格)
3321!
3422"
3523#
3624$
3725%
3826&
3927'
4028(
4129)
422A*
432B+
442C,
452D-
462E.
472F/
48300
49311
50322
51333
52344
53355
54366
55377
56388
57399
583A:
593B;
603C<
613D=
623E>
633F?
6440@
6541A
6642B
6743C
6844D
6945E
7046F
7147G
7248H
7349I
744AJ
754BK
764CL
774DM
784EN
794FO
8050P
8151Q
8252R
8353S
8454T
8555U
8656V
8757W
8858X
8959Y
905AZ
915B[
925C\
935D]
945E^
955F_
9660`
9761a
9862b
9963c
10064d
10165e
10266f
10367g
10468h
10569i
1066Aj
1076Bk
1086Cl
1096Dm
1106En
1116Fo
11270p
11371q
11472r
11573s
11674t
11775u
11876v
11977w
12078x
12179y
1227Az
1237B{
1247C|
1257D}
1267E~
1277FDEL

它涵盖了 128 个字符的 ASCII 集,包括控制字符、可打印字符、标点符号和特殊符号。该表提供了表示 ASCII 编码标准中每个字符的十进制和十六进制值。

C++ 实现

  • 获取需要转换的 ASCII 字符的十进制值。例如,'A' 的十进制值为 65。
  • 对于 0 到 127 之间的 ASCII 值,只需将 ASCII 十进制值直接分配给 Unicode 代码点即可。这是有效的,因为 Unicode 向后兼容 ASCII,并且对于前 128 个字符保持相同的值。
  • 所以对于 ASCII 值 65 的 'A',等效的 Unicode 代码点值也为 65。
  • 要将其转换为实际的 Unicode 字符,请在 C++ 中将代码点 int 变量转换为 char 或 wchar_t 类型。

例如

  • 这会将 ASCII 值复制到 Unicode 变量,该变量将其解释为 Unicode 代码点并进行转换。
  • 对于高于 127 的 ASCII 值,需要查找表或 switch 语句才能将 ASCII 值映射到相应的 Unicode 代码点。
  • mbstowcs 或 MultiByteToWideChar 等 Unicode 库函数也可以将 ASCII 转换为 Unicode。

因此,总而言之,对于 ASCII 范围 0-127,只需将 ASCII 十进制值作为 Unicode 分配/转换即可。使用映射机制来处理 127 以上的扩展 ASCII,以获取等效的 Unicode 代码点。将结果整数代码点转换为wchar_t或 char 以获取 Unicode 字符。

输出

Enter an ASCII code (0-127): 65
Unicode character: A