第二章 Unicode简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.3 宽字符和 Windows
• Windows 底层支援Unicode。但其它许多地方还不使用16 底层支援 。但其它许多地方还不使用 位字符串,所以Windows必须经常将字符串在操作系统内 位字符串,所以 必须经常将字符串在操作系统内 转换。 转换。 • Windows NT可执行为 可执行为ASCII、Unicode或者 或者ASCII和Unicode 可执行为 、 或者 和 混合编写的程序。 支持不同的API函数呼叫 混合编写的程序。即Windows支持不同的 函数呼叫, 支持不同的 函数呼叫, 这些函数接受8位或 位的字符串。 位或16位的字符串 这些函数接受 位或 位的字符串。 • 应编写既为 应编写既为ASCII又为 又为Unicode编译的原始码。这是本书中 编译的原始码。 又为 编译的原始码 所有程序的编写方式。 所有程序的编写方式。
第二章 Unicode简介 简介
第二章 Unicode简介 简介
• Unicode扩展自 扩展自ASCII字符集。 字符集。 扩展自 字符集 • 在ASCII中,每个字符用7位表示,或者计算 中 每个字符用 位表示 位表示, 机上普遍使用的每字符有8位宽 位宽; 机上普遍使用的每字符有 位宽; • 而Unicode使用全 位字符集。这使得 使用全16位字符集 使用全 位字符集。 Unicode能够表示世界上所有的书写语言中 能够表示世界上所有的书写语言中 可能用于计算机通讯的字符、 可能用于计算机通讯的字符、象形文字和 其它符号。 其它符号。 • Unicode最初作为 最初作为ASCII的补充,最终将代替 的补充, 最初作为 的补充 它。
2.2.1 Char数据类型 数据类型
• 在C程序中使用 程序中使用char数据类型来定义和储存 程序中使用 数据类型来定义和储存 字符跟字符串。 字符跟字符串。 • char c = 'A' ; • char * p = "Hello!" ; • char a[10] ; • char a[] = "Hello!" ; • 字符串都储存在静态程序内存中,并在末 字符串都储存在静态程序内存中, 尾添加0,这样就需要7个字节的储存空间 的储存空间。 尾添加 ,这样就需要 个字节的储存空间。
美国信息交换标准码
2.1.2 ASCII的问题 的问题
• ASCII是美国标准,不能满足其它讲英语国家的 是美国标准, 是美国标准 需要。例如英国的英镑符号£? 需要。例如英国的英镑符号£? • 没有读音符号 :在美国以南、以北,以及大西 在美国以南、 在美国以南 以北, 洋地区的许多国家, 洋地区的许多国家,在语言中使用读音符号很 普遍。例如希腊语、希伯来语、 普遍。例如希腊语、希伯来语、阿拉伯语和俄 使用斯拉夫字母表)。 )。如果您向东走得更 语(使用斯拉夫字母表)。如果您向东走得更 就会发现中国象形汉字, 远,就会发现中国象形汉字,日本和朝鲜也采 用汉字系统。 用汉字系统。 • ASCII的历史开始于 的历史开始于1967年,此后它主要致力 的历史开始于 年 于克服其自身限制以更适合于非美国英语的其 它语言。 它语言。
2.1.5 Unicode解决方案 解决方案
• Unicode使用宽字符集 每个字符都是16位宽而不是 位宽。 使用宽字符集, 每个字符都是 位宽而不是8位宽。 使用宽字符集 位宽而不是 位宽 • 128个Unicode字符(从0x0000到0x007F)是ASCII字符,接 个 字符( 到 字符, 字符 ) 字符 下来的128个Unicode字符(从0x0080到0x00FF)扩展 字符( 下来的 个 字符 到 )扩展ASCII。 。 • Unicode中不同部分的字符都基于现有标准。这便于转换。 中不同部分的字符都基于现有标准。 中不同部分的字符都基于现有标准 这便于转换。 – 希腊字母表使用从 希腊字母表使用从0x0370到0x03FF的代码 到 的代码 – 斯拉夫语使用从 斯拉夫语使用从0x0400到0x04FF的代码 到 的代码 – 美国使用从 美国使用从0x0530到0x058F的代码 到 的代码 – 希伯来语使用从 希伯来语使用从0x0590到0x05FF的代码 到 的代码 – 中日韩的文字(CJK)占用从 中日韩的文字( )占用从0x3000到0x9FFF的代码。 的代码。 到 的代码 • Unicode的最大好处是这里只有一个字符集。 的最大好处是这里只有一个字符集。 的最大好处是这里只有一个字符集
2.2 宽字符和 C语言 语言
• 美国国家标准程序设计语言-C(也称作 美国国家标准程序设计语言- (也称作ANSI C)通过 ) 一个称作宽字符 宽字符的概念来支持用多个字节代表一字符的 一个称作宽字符的概念来支持用多个字节代表一字符的 字符集。这些宽字符与常用的字符完美地共存。 字符集。这些宽字符与常用的字符完美地共存。 • ANSI C也支持多字节字符集,例如中文、日文和韩文版 也支持多字节字符集 也支持多字节字符集,例如中文、 支持的字符集。 本Windows支持的字符集。然而,这些多字节字符集被 支持的字符集 然而, 当成单字节构成的字符串看待, 当成单字节构成的字符串看待,只不过其中一些字符改 变了后续字符的含义而已。多字节字符集主要影响C语 变了后续字符的含义而已。多字节字符集主要影响 语 言程序执行时期链接库函数。相比之下, 言程序执行时期链接库函数。相比之下,宽字符比正常 字符宽,而且会引起一些编译问题。 字符宽,而且会引起一些编译问题。 • 宽字符不需要是 宽字符不需要是Unicode。Unicode是一种可能的宽字符 。 是一种可能的宽字符 然而,因为本书的焦点是Windows而不是 执行的 而不是C执行的 集。然而,因为本书的焦点是 而不是 理论,所以我将把宽字符和Unicode作为同义语。 作为同义语。 理论,所以我将把宽字符和 作为同义语
2.1.1 美国信息交换标准码
• 美国信息交换标准码(ASCII:American 美国信息交换标准码( : Standard Code for Information Interchange) )
– 字符码就 个小写字母、26个大写字母、10个 字符码就26个小写字母 个小写字母、 个大写字母 个大写字母、 个 数字、 个符号 个符号、 个句柄和一个空格 个句柄和一个空格, 数字、32个符号、33个句柄和一个空格,总共 128个字符码。 个字符码。 个字符码 – ASCII现在记录在 现在记录在ANSI X3.4-1986字符集-用于 字符集- 现在记录在 字符集 信息交换的7位美国国家标准码 位美国国家标准码,由美国国家标 信息交换的 位美国国家标准码 由美国国家标 准协会发布。 准协会发布。
2.3.1Windows表头文件类型 表头文件类型
• WINNT.H定义为一般字符类型。 定义为一般字符类型。 定义为一般字符类型 • #ifdef UNICODE – typedef WCHAR TCHAR, * PTCHAR ; – typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ; – typedef LPCWSTR LPCTSTR ; • #else – typedef char TCHAR, * PTCHAR ; – typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ; – typedef LPCSTR LPCTSTR ; • #endif ;
2.1.3 扩展 扩展ASCII
பைடு நூலகம்
2.1.4 双字节字符集
• 双字节字符集(DBCS:double-byte character set)。 双字节字符集( : )。 • 最初的128个代码是 个代码是ASCII。较高的 最初的 个代码是 。较高的128个代码总是跟 个代码总是跟 随着第二个字节。这两个字节一起( 随着第二个字节。这两个字节一起(称作首字节和 跟随字节)定义一个字符, 跟随字节)定义一个字符,通常是一个复杂的象形 文字。 文字。 • 虽然中文、日文和韩文共享一些相同的文字,但显 虽然中文、日文和韩文共享一些相同的文字, 然这三种语言是不同的, 然这三种语言是不同的,且同一个象形文字在不同 的语言中代表三件不同的事。 的语言中代表三件不同的事。 • Windows支持的双字节字符集: 支持的双字节字符集: 支持的双字节字符集 • 代码页 代码页932(日文)\936(简体中文)\949(韩语) (日文) (简体中文) (韩语) \950(繁体汉字) (繁体汉字) • 附加的程序设计问题 附加的程序设计问题.
2.2.2 宽字符
• C中的宽字符数据类型 在WCHAR.H中定义: 中的宽字符数据类型, 中定义: 中的宽字符数据类型 中定义
– typedef unsigned short wchar_t ;
• wchar_t c = 'A' ; • wchar_t * p = L"Hello!" ; • L代表 代表long。告诉编译器该字符串按宽字符 代表 。 保存。 保存。 • 定义宽字符数组: 定义宽字符数组: • static wchar_t a[] = L"Hello!" ;
2.3.1 Windows表头文件类型 表头文件类型
• WINDEF.H
– Windows中使用的基本型态定义 中使用的基本型态定义 – 它包括WINNT.H 它包括 • 处理基本的 处理基本的Unicode支持。 支持。 支持 • 包含 的表头文件 包含C的表头文件 的表头文件CTYPE.H,包括 的定义。 ,包括wchar_t的定义。 的定义 – WINNT.H定义数据类型 定义数据类型CHAR和WCHAR 定义数据类型 和 – WINNT.H表头文件定义了 位字符串指针的数据类型和四个 表头文件定义了8位字符串指针的数据类型和四个 表头文件定义了 位字符串指针的数据类型和四个const 8位 位 字符串指针的数据类型。 字符串指针的数据类型。 • typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ; • typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ; – 六种可作为 位字符串指针的数据类型和四种可作为 六种可作为16位字符串指针的数据类型和四种可作为 位字符串指针的数据类型和四种可作为const 16位字符 位字符 串指针的数据类型: 串指针的数据类型: • typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ; • typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;
2.2.4 维护单一原始码
Microsoft Visual C++的TCHAR.H表头文件。 表头文件。 的 表头文件 • TCHAR.H的数据类型 _T __T _TEXT 的数据类型/L 的数据类型 • #define _T(x)__T(x) ( ) ( ) • #define _TEXT(x)__T(x) ( ) ( ) • #if define _UNICODE • #define __T(x) L##x • #define TCHAR wchar_t; • #define _tcslen wcslen; • #else • #define __T(x) x • #define TCHAR char; • #define _tcslen strlen; • #endif
2.1.5 Unicode解决方案 解决方案
• Unicode参考文献 参考文献
– The Unicode Standard,Version 2.0(Addison, ( Wesley出版社,1996年)。 出版社, 出版社 年
• Unicode缺点 缺点
– Unicode字符串占用的内存是 字符串占用的内存是ASCII字符串的两 字符串占用的内存是 字符串的两 倍。 – 人们相对来说还不习惯使用 人们相对来说还不习惯使用Unicode。 。
相关文档
最新文档