登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

倚天 ^_^

土扶可城墙,积德为厚地。 天行健,君子以自强不息。

 
 
 

日志

 
 

ASCII 、ANSI、 MBCS、 Unicode 、UTF-8/16/32  

2010-09-01 20:57:47|  分类: 软件学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
       引子:在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset)。 

    在最初的时候,Internet上只有一种字符集——ANSI(abbr. 美国国家标准协会 America National Standards Institute)的ASCII字符集,它使用7 bits来表示一个字符,总共表示128个字符,其中包括了英文字母、数字、标点符号等常用字符。之后,又进行扩展,使用8 bits表示一个字符,可以表示256个字符,主要在原来的7 bits字符集的基础上加入了一些特殊符号例如制表符。 

     后来,由于各国语言的加入,ASCII已经不能满足信息交流的需要,因此,为了能够表示其它国家的文字,各国在ASCII的基础上制定了自己的字符集,这些从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符系统)。这些派生字符集的特点是以ASCII 127 bits为基础,兼容ASCII 127,他们使用大于128的编码作为一个Leading Byte,紧跟在Leading Byte后的第二(甚至第三)个字符与Leading Byte一起作为实际的编码。这样的字符集有很多,我们常见的GB-2312就是其中之一。 
  例如在GB-2312字符集中,“连通”的编码为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字符集,它固定使用16 bits(两个字节、一个字)来表示一个字符,共可以表示65536个字符。将世界上几乎所有语言的常用字符收录其中,方便了信息交流。标准的Unicode称为UTF-16。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。注意UTF-8是编码,它属于Unicode字符集。Unicode字符集有多种编码形式,而ASCII只有一种,大多数MBCS(包括GB-2312)也只有一种。Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“A”的编码都是0x41.UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。 
  例如“连通”两个字的Unicode标准编码UTF-16 (big endian)为:DE 8F 1A 90 ,而其UTF-8编码为:E8 BF 9E E9 80 9A .

  最后,当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。

1. Windows定义设置的Unicode数据类型有哪些?   
     数据类型        说明   
     WCHAR           Unicode字符   
     PWSTR           指向Unicode字符串的指针   
     PCWSTR          指向1个恒定的Unicode字符串的指针   
     对应的ANSI数据类型分别为:CHAR、LPSTR、LPCSTR。   
     ANSI/Unicode通用数据类型为TCHAR、PTSTR、LPCTSTR。   
2.  如何对Unicode进行操作?   
  字符集            特性                                 实例   
  ANSI                  操作函数function以str开头                  strcpy   
  Unicode               操作函数function以wcs开头                  wcscpy   
  MBCS                  操作函数function以_mbs开头                 _mbscpy   
  ANSI/Unicode          操作函数function以_tcs开头                _tcscpy(C运行期库)   
  ANSI/Unicode          操作函数function以lstr开头                 lstrcpy(Windows函数function)   
  所有新的及未过时的函数function住Windows2000中都同时拥有ANSI及Unicode两个版本。ANSI版本函数function结尾以A表示;Unicode版本函数function结尾以W表示。Windows如下定义设置:   
  #ifdef     UNICODE   
  #define     CreateWindowEx     CreateWindowExW   
  #else   
  #define     CreateWindowEx     CreateWindowExA   
  #endif       //   !UNICODE
3. 如何表示Unicode字符串常量?   
  字符集                  实例   
  ANSI                  “string”   
  Unicode               L“string”   
  ANSI/Unicode          T(“string”)或_TEXT(“string”)
                        if(   szError[0]   ==   _TEXT(‘J’)   )
                        {   }   
 
  评论这张
 
阅读(1060)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018