Unicode字符集和多字节字符集关系

上传人:宝路 文档编号:17401752 上传时间:2017-11-11 格式:DOC 页数:8 大小:60.52KB
返回 下载 相关 举报
Unicode字符集和多字节字符集关系_第1页
第1页 / 共8页
Unicode字符集和多字节字符集关系_第2页
第2页 / 共8页
Unicode字符集和多字节字符集关系_第3页
第3页 / 共8页
Unicode字符集和多字节字符集关系_第4页
第4页 / 共8页
Unicode字符集和多字节字符集关系_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《Unicode字符集和多字节字符集关系》由会员分享,可在线阅读,更多相关《Unicode字符集和多字节字符集关系(8页珍藏版)》请在金锄头文库上搜索。

1、Unicode 字符集和多字节字符集关系在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset)。 在最初的时候,Internet 上只有一种字符集ANSI 的 ASCII 字符集,它使用 7 bits 来表示一个字符,总共表示 128个字符,其中包括了英文字母、数字、标点符号等常用字符。之后,又进行扩展,使用 8 bits 表示一个字符,可以表示256 个字符,主要在原来的 7 bits 字符集的基础上加入了一些特殊符号例如制表符。 后来,由于各国语言的加入,ASCII 已经不能满足信息交流的需要,因此,为

2、了能够表示其它国家的文字,各国在ASCII 的基础上制定了自己的字符集,这些从 ANSI 标准派生的字符集被习惯的统称为 ANSI 字符集,它们正式的名称应该是 MBCS(Multi-Byte Chactacter System,即多字节字符系统)。这些派生字符集的特点是以 ASCII 127 bits 为基础,兼容 ASCII 127,他们使用大于 128 的编码作为一个 Leading Byte,紧跟在 Leading Byte 后的第二(甚至第三)个字符与 Leading Byte 一起作为实际的编码。这样的字符集有很多,我们常见的 GB-2312 就是其中之一。 例如在 GB-2312

3、 字符集中, “连通”的编码为 C1 AC CD A8,其中 C1 和 CD 就是 Leading Byte。前 127 个编码为标准ASCII 保留,例如“0”的编码是 30H( 30H 表示十六进制的 30)。软件在读取时,如果看到 30H,知道它小于 128 就是标准 ASCII,表示“0”,看到 C1 大于 128 就知道它后面有一个另外的编码,因此 C1 AC 一同构成一个整个的编码,在GB-2312 字符集中表示 “连”。 由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,提出了 Unicode 字符集,它 固定使用 1

4、6 bits(两个字节、一个字)来表示一个字符,共可以表示 65536 个字符。将世界上几乎所有语言的常用字符收录其中,方便了信息交流。标准的 Unicode 称为 UTF-16。后来为了双字节的 Unicode 能够在现存的处理单字节的系统上正确传输,出现了 UTF-8,使用类似 MBCS 的方式对 Unicode 进行编码。注意 UTF-8 是编码,它属于 Unicode 字符集。Unicode 字符集有多种编码形式,而 ASCII 只有一种,大多数 MBCS(包括 GB-2312)也只有一种。Unicode 的最初目标,是用 1 个 16 位的编码来为超过 65000 字符提供映射。但这

5、还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-aches),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序 16 位的数据。因此,Unicode 用一些基本的保留字符制定了三套编码方式。它们分别是 UTF-8,UTF-16 和 UTF-32。正如名字所示,在 UTF8 中,字符是以 8 位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是 UTF8 保留了 ASCII 字符的编码做为它的一部分,例如,在UTF 8 和 ASCII 中, “A”的编码都是 0x41.UTF16 和 UTF32 分别是 Unicode

6、 的 16 位和 32 位编码方式。考虑到最初的目的,通常说的 Unicode 就是指 UTF-16。 例如“连通” 两个字的 Unicode 标准编码 UTF-16 (big endian)为:DE 8F 1A 90 而其 UTF-8 编码为:E8 BF 9E E9 80 9A 最后,当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件有三种途径来决定文本的字符集和编码: 最标准的途径是检测文本最开头的几个字节,如下表: 开头字节 Charset/encoding EF BB BF UTF-8 FE FF UTF-16/UCS-2, little

7、 endian FF FE UTF-16/UCS-2, big endian FF FE 00 00 UTF-32/UCS-4, little endian.00 00 FE FF UTF-32/UCS-4, big-endian.例如插入标记后,连通”两个字的 UTF-16 (big endian)和 UTF-8 码分别为: FF FE DE 8F 1A 90 EF BB BF E8 BF 9E E9 80 9A 但是 MBCS 文本没有这些位于开头的字符集标记,更不幸的是,一些早期的和一些设计不良的软件在保存 Unicode 文本时不插入这些位于开头的字符集标记。因此,软件不能依赖于这种途

8、径。这时,软件可以采取一种比较安全的方式来决定字符集及其编码,那就是弹出一个对话框来请示用户,例如将那个“连通”文件拖到 MS Word 中,Word 就会弹出一个对话框。 如果软件不想麻烦用户,或者它不方便向用户请示,那它只能采取自己“猜”的方法,软件可以根据整个文本的特征来猜测它可能属于哪个 charset,这就很可能不准了。使用记事本打开那个 “连通”文件就属于这种情况。 我们可以证明这一点:在记事本中键入“连通”后,选择“Save As”,会看到最后一个下拉框中显示有“ANSI”,这时保存。当再当打开“连通” 文件出现乱码后,再点击“File”-“Save As”,会看到最后一个下拉框

9、中显示有“UTF-8”,这说明记事本认为当前打开的这个文本是一个 UTF-8 编码的文本。而我们刚才保存时是用 ANSI 字符集保存的。这说明,记事本猜测了“连通” 文件的字符集,认为它更像一个 UTF-8 编码文本。这是因为“连通”两个字的 GB-2312 编码看起来更像 UTF-8 编码导致的,这是一个巧合,不是所有文字都这样。可以使用记事本的打开功能,在打开“连通”文件时在最后一个下拉框中选择 ANSI,就能正常显示了。反过来,如果之前保存时保存为 UTF-8 编码,则直接打开也不会出现问题。 如果将“连通” 文件放入 MS Word 中,Word 也会认为它是一个 UTF-8 编码的文

10、件,但它不能确定,因此会弹出一个对话框询问用户,这时选择“简体中文(GB2312)”,就能正常打开了。记事本在这一点上做得比较简化罢了,这与这个程序的定位是一致的。 需要提醒大家的是,部分 Windows 2000 字型无法显示所有的 Unicode 字符。如果发现文件中缺少了某些字符,只需将其变更为其它字型即可。 big endian 和 little endian big endian 和 little endian 是 CPU 处理多字节数的不同方式。 例如“汉”字的 Unicode 编码是 6C49。那么写到文件里时,究竟是将 6C 写在前面,还是将 49 写在前面?如果将 6C 写在

11、前面,就是 big endian。还是将 49 写在前面,就是 little endian。 “endian”这个词出自格列佛游记。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。 我们一般将 endian 翻译成“ 字节序”,将 big endian 和 little endian 称作“大尾”和“小尾”。 Unicode big endian:在 Big-endian 处理器(如苹果 Macintosh 电脑)上建立的 Unicode 文件中的文字位元组(存放单位)排列

12、顺序,与在 Intel 处理器上建立的文件的文字位元组排列顺序相反。最重要的位元组拥有最低的地址,且会先储存文字中较大的一端。为使这类电脑的用户能够存取你的文件,可选择 Unicode big-endian 格式。#ANSI 字符,UNICODE,宽字符,窄字符,多字节字符集Unicode :宽字节字符集 1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数? 可以调用 Microsoft Visual C+的运行期库包含函数_mbslen 来操作多字节(既包括单字节也包括双字节)字符串。 调用 strlen 函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的 0

13、 之前有多少个字节。 2. 如何对 DBCS(双字节字符集)字符串进行操作? 函数 描述 PTSTR CharNext ( LPCTSTR ); 返回字符串中下一个字符的地址 PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一个字符的地址 BOOL IsDBCSLeadByte( BYTE ); 如果该字节是 DBCS 字符的第一个字节,则返回非 0 值 3. 为什么要使用 Unicode? (1 ) 可以很容易地在不同语言之间进行数据交换。 (2 ) 使你能够 分配支持所有语言的单个二进制.exe 文件或 DLL 文件。 (3 ) 提高应用程序的运行效

14、率。 Windows 2000 是使用 Unicode 从头进行开发的,如果调用任何一个 Windows 函数并给它传递一个 ANSI 字符串,那么系统首先要将字符串转换成 Unicode,然后将 Unicode 字符串传递给操作系统。如果希望函数返回 ANSI 字符串,系统就会首先将 Unicode 字符串转换成 ANSI 字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用 Unicode 来开发应用程序,就能够使你的应用程序更加有效地运行。 Windows CE 本身就是使用 Unicode 的一种操作系统,完全不支持 ANSI Window

15、s 函数Windows 98 只支持 ANSI,只能为 ANSI 开发应用程序。 Microsoft 公司将 COM 从 16 位 Windows 转换成 Win32 时,公司决定需要字符串的所有 COM 接口方法都只能接受Unicode 字符串。 4. 如何编写 Unicode 源代码? Microsoft 公司为 Unicode 设计了 WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用 Unicode 来对它进行编译。只需要 定义两个宏(UNICODE 和_UNICODE),就可以修改然后重新编译该源文件。 _UNICODE 宏用于 C

16、 运行期头文件,而 UNICODE 宏则用于 Windows 头文件。当编译源代码模块时,通常必须同时定义这两个宏。 5. Windows 定义的 Unicode 数据类型有哪些? 数据类型 说明 WCHAR Unicode 字符 PWSTR 指向 Unicode 字符串的指针 PCWSTR 指向一个恒定的 Unicode 字符串的指针 对应的 ANSI 数据类型为 CHAR,LPSTR 和 LPCSTR。 ANSI/Unicode 通用数据类型为 TCHAR,PTSTR,LPCTSTR 。 6. 如何对 Unicode 进行操作? 字符集 特性 实例 ANSI 操作函数以 str 开头 strcpy Unicode 操作函数以 wcs 开头 wcscpy MBCS 操作函数以_mbs 开头 _mbscpyANSI/Unicode 操作函数以_tcs 开头 _tcscpy(C 运行期库) ANS

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号