字符集与编码.pptx_第1页
字符集与编码.pptx_第2页
字符集与编码.pptx_第3页
字符集与编码.pptx_第4页
字符集与编码.pptx_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、字符集与编码,通信增值事业部 梁浩 2011年5月15日,目录,字符集和编码的概念 编码在编程中的应用,字符与编码的发展,字符串在内存中的存放方法(一),在 ASCII 阶段:42 6F6231323300 B ob1230 引入非ASCII字符之后: D6 D0CEC431323300 中文1230,字符串在内存中的存放方法(二),Unicode被采用后: 2D 4E 87 65 31 00 32 00 33 00 00 00 中 文 1 2 3 0,字符,字节,字符串,字符 们使用的记号,抽象意义上的一个符号。 如:1, 中, a, $, ¥, 字节 计算机中存储数据的单元,一个8位的二进

2、制数,是一个很具体的存储空间。 如:0 x01, 0 x45, 0 xFA, ANSI 字符串 在内存中,如果“字符”是以ANSI 编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为ANSI 字符串或者多字节字符串。 Unicode字符串 在内存中,如果“字符”是以在 UNICODE 中的序号存在的,那么我们称这种字符串为UNICODE 字符串或者宽字节字符串。,字符集与编码,各个国家和地区所制定的不同 ANSI 编码标准中,都只规定了各自语言所需的“字符”。比如:汉字标准(GB2312)中没有规定韩语字符。 这些 ANSI 编码标准所规定的内容包含两层含义 使用

3、哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。 规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。 “字符集”和“编码”一般都是同时制定的。平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。,Unicode字符集与Unicode编码,“UNICODE 字符集”包含了各种语言中使用到的所有“字符”。 UNICODE 字符集编码的标准有很多 如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeB

4、ig 等,常用编码单字节编码,ISO-8859-1 又称Latin-1或“西欧语言” 包含大部欧洲使用的字符,如德、意、西、葡语,以及阿尔巴尼亚语、巴斯克语等。 它以ASCII为基础,在空置的0 xA0-0 xFF的范围内,加入96个字母及符号 法语及芬兰语本来也使用ISO/IEC 8859-1来表示。但因为缺少一些符号,故于1998年被ISO/IEC 8859-15所取代。(ISO 8859-15同时加入了欧元符号) /wiki/ISO/IEC_8859-1,常用编码ANSI编码,GB2312/GBK/GB18030(简体中文) BIG5(繁体中文

5、) Shift_JIS(日文) ,GB2312/GBK/GB18030编码,GB2312 又称 GB 2312-80 简体中文字符集的中国国家标准, 1981年5月1日实施 通行于中国大陆;新加坡等地也采用 中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。 GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个 GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率 GBK与GB18030 对于人名、古汉语等方面出现的罕用字,GB2312并没有收录,GBK及GB18030字符集主要是增加这些不常用的汉字

6、或字符。 GB18030兼容GBK, GBK兼容GB2312 GB18030是最新的汉字字符集,可以处理所有汉字字符,BIG-5编码,BIG-5编码 又称大五码,是通行于台湾、香港地区的一个繁体字编码方案。 共收录13,060个中文字 BIG-5的问题 很多字未收录,如“堃”(台湾当局“总统府”秘书长游锡堃)、“喆”(歌手陶喆)等 各种衍生版本,不统一 现在大多数应用程序直接支持Unicode以避免这些问题。,常用编码Unicode编码,UTF-8 UTF-16 UTF-32 UnicodeBig/UnicodeLittle 注意:前面说大部分情况下,字符集和编码是一回事,但是Unicode不

7、一样。,编码的实质,我们实际上没有必要去深究每一种编码具体把某一个字符编码成了哪几个字节,我们只需要知道“编码”的概念就是把“字符”转化成“字节”就可以了。 对于“UNICODE 编码”,由于它们是可以通过计算得到的,因此,在特殊的场合,我们可以去了解某一种“UNICODE 编码”如UTF-8是怎样的规则。,UTF-16编码,UTF-16编码 如果字符编码小于0 x10000,也就是十进制的0到65535之内,则直接使用两字节表示 如果字符编码大于0 x10000,用四字节表示,UCS-2编码,UTF-16可看成是UCS-2的父集 对于小于0 x10000的字符,UTF-16编码就等于UCS-

8、2编码 现在若有软件声称自己支持UCS-2编码,那其实是暗指它不能支持在UTF-16中超过2bytes的字符。,UTF-8编码(一),为什么要UTF-8 ASCII转换成UTF16/UCS-2,在编码前插入一个0 x0。用这些编码,会含括一些控制符,比如或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码,也因此诞生了UTF-8。,UTF-8编码(二),Unicode和UTF-8之间的转换关系表,举例: Unicode: 100111101100000 4F60 UTF-8 : 11100100,10111101,10100000 E

9、4BDA0,UTF-8编码(三),简单来说,UTF-8特点: 字符的长度是可变的 字符是有特征的,可以方便检测出来 英文字符:1字节 一般中文字符:3字节 特殊中文字符:4-6字节 不同长度字符检测办法: 第一位是0的字节,说明是ASCII,1字节是1个字符 前四位是1110的字节,说明是从这个字节开始向后共3个字节是1个字符 (参见前表),UTF-8编码(四),IETF规定所有互联网协议都要支持UTF-8 但现实情况 规定往往都是在事实标准成立以后制定的 不能强制早期的软件都要修改 新的软件也要遵重事实标准,明知不规范,考虑到易用性,往往也要作一些让步,CodePage 代码页的概念,代码页

10、实际上就是编码的意思。是编码的另外一种说法。 代码页: 950 繁体中文 949 朝鲜语 936 简体中文 932 日语 65001 UTF-8,Big Endian和Little Endian的概念,Big Endian:高位在低字节 Little Endian:高位在高字节 以内存数据0 x0A0B0C0D举例: 网络字节序 网络传输一般采用Big Endian,也称为网络字节序,或网络序,BOM的概念,BOM=Byte Order Mark 是存储在文件开头的几个特殊字节,用以表明文件的编码格式的。 例如: UTF-8EF BB BF UTF-16(Little Endian)FF FE

11、 UTF-16(Big Endian)FE FF,自动检测编码,某些程序可以自动检测编码 例如:记事本、IE 流览器 实质上就是扫描一下所有字符,根据文件的BOM,或者各种字符集的特征(如UTF-8有明显特征)自动确定编码 这些自动检测可能不准 某些API带有自动检测编码的参数 实际上是检查BOM 一般不建议使用,编码间的转换,某些编码格式之间可以有一些简单的算法转换 如 UTF-8与UTF-16 某些编码格式之间是没有任何规律的 如GB2312与UTF-8之间 实质上是查询码表一个字符一个字符找到的 不是任意格式间都能互转,编码在HTTP协议中的应用,Accept-Charset 浏览器申明

12、自己接收的字符集,如gb2312,utf-8(这里说的Charset其实不仅是字符集,而且包括了相应的字符编码方案); Accept-Encoding 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码); Accept-Language 浏览器申明自己接收的语言,如 zh-CN。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等; Content-Type WEB服务器告诉浏览器自己响应的对象的类型和字符集。例如:Content-Type: text/html; chars

13、et=utf-8 Content-Encoding WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip Content-Language WEB服务器告诉浏览器自己响应的对象的语言。,目录,字符集和编码的概念 编码在编程中的应用 开发工具对Unicode的支持 编写ANSI和Unicode兼容的代码 如何选择ANSI和Unicode,C+编译器对Unicode的支持,C+编译器提供了UNICODE/_UNICODE预定义宏,用以支持Unicode Visual C+的项目设置 可以在项目设置里修改Unicode或

14、ANSI Visual C+2005以后项目默认就是Unicode UNICODE与_UNICODE区别 UNICODE宏用于Windows头文件 _UNICODE宏用于C运行期头文件,Windows API对Unicode的支持,所有涉及到字符集的函数都既有ANSI版本和Unicode版本。 如 OutPutDebugString函数 ANSI: OutPutDebugStringA Unicode:OutPutDebugStringW,TCHAR.H头文件,定义了所有跟字符或字符串有关的函数,包括: 字符串操作函数 文件操作函数 控制台操作函数 等等。 根据是否设置UNICODE宏,来简化

15、API调用 如果定义UNICODE宏,OutPutDebugString = OutPutDebugStringW,反之,= OutPutDebugStringA,Unicode字符,WCHAR, _WCHAR, wchar_t 等等。 实质上就是 unsigned short,Unicode字符串常量,普通字符串常是ANSI的, 如 “Hello, World” Unicode字符串常量必须加上 L 标记 如 L”Hello, World”,编码转换,WideCharToMultiByte Unicode字符串转为多字节串 MultiByteToWideChar 多字节字符串转为Unicod

16、e字符串 注意: 传入正确的CodePage 多字节字符串的长度是不固定的,要先把 cbMultiByte 设为0,这样函数会计算一下要多大储空间,然后再次调用。,目录,字符集和编码的概念 编码在编程中的应用 开发工具对Unicode的支持 编写ANSI和Unicode兼容的代码 如何选择ANSI和Unicode,使用兼容的字符或字符串常量,_T 宏 _T(c) _T(“xxx”) _T宏能根据是否预定义UNICODE宏,来决定字符或字符串到底是ANSI的,还是Unicode的。即: 如果定义了UNICODE宏: _T(“xxx”)=L“xxx” 反之,_T(“xxx”)=“xxx”,使用TC

17、HAR定义字符串,TCHAR szText32,使用兼容的函数,_tcs 系列字符串函数,以 strcpy 为例: ANSI: strcpy Unicode: wcscpy 兼容: _tcscpy _tf 系列文件操作函数,以fopen为例: ANSI: fopen Unicode: _wfopen 兼容:_tfopen 等等,使用LPTSTR与LPCTSTR,LPTSTR:可改变的字符串指针 LPCTSTR:不可改变的字符串指针,其它注意事项,注意 sizeof 操作符 注意 strlen 函数,Unicode与ASCII混合编程,代码里允许同时用Unicode的函数和ANSI的函数。 这种情况下要特别注意符合要求,并写清楚注释。否则后边的人会搞错。,目录,字符集和编码的概念 编码在编程中的应用 开发工具对Unicode的支持 编写ANSI和Unicode兼容的代码 如何选择ANSI和Unicode,Unicode编程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论