历史
20世纪60年代,大型机和微型机制造商开始围绕 8 位字节作为最小数据类型进行标准化。7位的ASCII字符集成为报文机器与计算机终端编码字母数字符号的行业标准方法。多余的一位被用作校验位,确保数据存储和传输的完整性。结果,8 位字节成了计算机系统在内存中存储 ASCII 字符时,实际使用的数据类型。
随后,计算机制造商开始利用多余的一位,将 ASCII 字符集扩展,超越其原本有限的英文字母字符集。如 IBM 代码页 37、PETSCII 和 ISO 8859 这样的 8 位扩展集比比皆是,对希腊语、西里尔等许多其他字符提供终端支持。但是,这样的扩展仍有其局限,因为它们是特定于区域的,且往往不能联合使用。要从一个字符集转换到另一个,必须使用特定的转换程序,这往往在目标集中不存在等价字符时,导致破坏性的转译。
在 1989 年,国际标准化组织开始致力于统一字符集(UCS),一个多语言的字符集,既可以用 16 位(2 字节),也可以用 32 位(4 字节)值编码。这些更大的值,要求使用大于 8 位的数据类型,在内存中存储这些新的字符值。这样,wide character 这一术语就被用于将它们与传统的 8 位字符数据类型区分开来。
与UCS及Unicode的关系
Wide Character 指的是数据类型在内存中的大小。它不规定字符集中的每个值。这些值是用各种字符集来规定的,而其中 UCS 和 Unicode 只是两个常见的、可以包含字符比一个8位值更多的字符集。
与multibyte字符的关系
正如早期的数据传输系统备受无清晰8位数据通道之苦,现代传输系统往往不能支持用于字符数据的16位或32位数据通道。于是诞生了如 UTF-8 这样的字符编码系统,能使用多个字节,来编码大于单个8位符号表示范围的值。
C 标准对 multibyte 字符编码和 wide character 加以区分,前者使用固定或不固定的字节数代表每个字符(主要用于源码和外部文件中),后者则是单个对象中对字符的运行时表示法(通常大于8位)。
wide character的大小
UTF-16 小端字节(低位字节在前)是微软的编码标准(也是 Windows 操作系统的编码标准)。但它也通过“代理对”来支持 32 位编码。.Net 框架支持多种wide-character 实现方案,包括 UTF7、UTF8、UTF16 和 UTF32。
Java 平台要求将 wide character 变量定义为 16 位的值,且字符用 UTF-16 编码(由于过去使用 UCS-2),而现代诸如 Unix 一类的系统通常要求使用 UTF-32 编码的 32 位值。
编程规范
C 和 C++ 标准库包含了一系列功能,来处理 wide characters 及其字符串。wide character 是使用数据类型 wchar_t 来定义的,在原始的 C90 标准中,被定义为
- “一种 整型类型,其 值的范围,能代表支持的各区域中指定的最大扩展字符集中,所有成员的确切代码”( ISO 9899:1990 §4.1.5 )
C 和 C++ 都在其各自标准的 2011 修改版中,引入了固定大小的字符类型 char16_t 和 char32_t,来无歧义地表示 16 位和 32 位 Unicode 传输格式,而 wchar_t 留由实作环境决定。ISO/IEC 10646:2003 Unicode 标准 4.0 中写到:
- “wchar_t 的宽度视编译器而定,可能仅有 8 位之小。因此,需要可以移植到任何 C 或 C++ 编译器上的程序,不应使用 wchar_t 来存储 Unicode 文本。wchar_t 数据类型是用于存储编译器定义的 wide character 的,这些 wide character 在某些编译器中可能是 Unicode 字符。”
Python
根据 Python 的文档,该语言有时使用 wchar_t 作为其字符类型 Py_UNICODE 的基础。这取决于 wchar_t 是否“兼容该系统上所选的 Python Unicode 版本变量”。