更新时间:2023-12-07 09:51
代码页是字符集编码的别名,也有人称内码表。早期,代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称。
代码页是字符集BIOS本身支持的字符集编码的名称。当时通用的操作系统都是命令行界面系统,这些操作系统直接使用BIOS供应的VGA功能来显示字符,操作系统的编码支持也就依靠BIOS的编码。现在这BIOS代码页被称为OEM代码页。图形操作系统解决了此问题,图形操作系统使用自己字符呈现引擎可以支持很多不同的字符集编码。
早期IBM和微软内部使用特别数字来标记这些编码,其实大多的这些编码已经有自己的名称了。虽然图形操作系统可以支持很多编码,很多微软程序还使用这些数字来点名某编码。
对于字符和Unicode数据的位模式的定义,此模式代表特定字母、数字或符号(例如 0x20 代表一个空格,而 0x74 代表字符“t”)。一些数据类型每个字符使用一个字节;每个字节可以具有 256 个不同的位模式中的一个模式。
在计算机中,字符由不同的位模式(ON 或 OFF)表示。每个字节有 8 位,这 8 位可以有 256 种不同的 ON 和 OFF 组合模式。对于使用 1 个字节存储每个字符的程序,通过给每个位模式指派字符可表示最多 256 个不同的字符。2 个字节有 16 位,这 16 位可以有 65,536 种唯一的 ON 和 OFF 组合模式。使用 2 个字节表示每个字符的程序可表示最多 65,536 个字符。
单字节代码页是字符定义,这些字符映射到每个字节可能有的 256 种位模式中的每一种。代码页定义大小写字符、数字、符号以及 !、@、#、% 等特殊字符字符。而且,在代码页间不停地转换需要花费大量的处理时间。
仅靠单字节字符集存储许多语言所使用的字符也是不够的。例如,一些亚洲语言包含上千个字符,所以每个字符必须使用双字节。双字节字符集正是为这些语言定义的。但是,这些语言都有各自的代码页,在运行不同双字节代码页的计算机之间传输数据也存在困难。
1258 越南语
1257 波罗的语
1256 阿拉伯语
1255 希伯来语
1254 土耳其语
1253 希腊语
1251 西里尔语
1250 中欧语言
950 繁体中文
949 朝鲜语
936 简体中文
932 日语
874 泰国语
850 多语种 (MS-DOS Latin1)
437 MS-DOS 美国英语
为解决在网络中支持多种代码页时出现的字符转换和解释问题,ISO 标准化组织和称为 Unicode Consortium 的团体定义了 Unicode 标准。Unicode 使用四个字节存储每个字符。由于 4,294,967,296 个字符足以涵盖世界上所有语言常用的字符,因此 Unicode 标准适用于所有的主要语言。如果网络中的所有计算机和程序都使用 Unicode,则无需进行任何字符转换,每个用户与所有其它用户看到的字符完全相同,并且不会丢失任何字符。
在运行 Microsoft Windows 操作系统的计算机上,操作系统和 Windows 应用程序使用的代码页由 Windows 区域设置定义。区域设置是在安装操作系统时选择的。Windows 应用程序使用由 Windows 区域设置定义的代码页来解释数据。Windows 应用程序还支持宽字符数据,即 Unicode 数据。
支持两类字符数据类型:
Unicode 数据类型
nchar、nvarchar 和 ntext。这些数据类型使用 Unicode 字符表示法。代码页不适用于这些数据类型。
非 Unicode 字符数据类型
char、varchar 和 text。这些数据类型使用单字节或双字节代码页中定义的字符表示法。
有关字符数据的存储方式以及代码页、Unicode 和排序次序操作的更多信息,请参见在 MSDN 页中的 Developing International Software for Windows 95 and Windows NT 4.0。
国际化数据和 Unicode
当只使用字符数据和代码页时,在一个数据库内很难以多种语言存储数据。很难为数据库找到一种代码页,能够存储所需全部语言特有的字符。对于运行各种代码页的不同客户端所读取和更新的特殊字符,要确保正确地转换也很困难。支持国际化客户端的数据库应始终使用 Unicode 数据,而不应使用非 Unicode 数据类型。
例如,北美洲客户的数据库必须处理三种主要语言:
墨西哥使用的西班牙文名称和地址。
魁北克使用的法文名称和地址。
加拿大的其余地区和美国使用的英文名称和地址。
当只使用字符列和代码页时须小心,以确保数据库所安装的代码页能够处理这三种语言的字符。当其中一种语言的字符由运行另一种语言的代码页的客户端读取时,必须更加小心以确保能够正确转换字符。
在DOS下可以通过mode命令来设置代码页。
选定代码页: MODE CON[:] CP SELECT=yyy
代码页状态: MODE CON[:] CP [/STATUS]
按Windows+R组合键,然后输入cmd或者command打开命令提示符。
比如输入:mode con cp select=936,则表示显示简体中文。如果输入mode con cp select=437,则表示显示MS-DOS 美国英语,而中文显示将会是?。
方法一:
通过system函数调用dos命令,该函数的头文件是stdlib.h。
方法二:
程序例:
#include
#include
int main( void )
SetConsoleOutputCP(936);
return 0;
输出:
简体中文
如果将代码页设置为437,那么无法正常输出简体中文:
╝≥╠σ╓╨╬─
Press any key to continue
随着 Internet 的发展,支持众多运行不同区域设置的客户端计算机变得日益重要。很难选择这样一种代码页,使其包含的字符数据类型能够支持全球范围用户所需的全部字符。
管理国际化数据库中的字符数据的最简单方法是始终使用 Unicode nchar、nvarchar 和 ntext 数据类型,代替对应的非 Unicode 数据类型(char、varchar 和 text)。如果所有使用国际化数据库的应用程序也采用 Unicode 变量而不是非 Unicode 变量,那么在系统中的任何地方都无须进行字符转换。每个客户端与所有其它客户端看见的字符数据都完全相同。
对于可使用单字节代码页的系统,Unicode 数据需要的存储空间是非 Unicode 字符数据的两倍,但却消除了在代码页间转换扩展字符的必要,因此至少部分弥补了上面的不足。使用双字节代码页的系统没有这个问题。
SQL Server 2000 将所有的文本化系统目录数据都存储在包含 Unicode 数据类型的列中。数据库对象(如表、视图和存储过程)的名称存储在 Unicode 列中。这样就可以只使用 Unicode 开发应用程序,从而避免了所有的代码页转换问题。
排序次序
排序次序指定 SQL Server 解释、排序、比较和显示字符
SQL Server 2000 对每种排序规则使用两种排序次序,一种用于 Unicode 数据,另一种用于字符代码页。
许多 SQL Server 排序规则使用相同的代码页,但是代码页的排序次序不同。这使站点得以选择:
是否仅根据位模式所表示的数字值来排序字符。二进制排序的速度最快,这是因为 SQL Server 不用做任何调整并可使用快速、简单的排序算法。二进制排序次序始终区分大小写。由于代码页中的位模式可能不按照特定语言的字典规则所定义的序列排列,二进制排序有时并不按照使用该语言的用户所期待的序列对字符进行排序。