c++下各种字符串的一点心得----字符集与编码

前言    
        你是否看到各大网站上铺天盖地的关于TCHAR, std::string, BSTR 等各种各样的字符串类型,还有那些以 _tcs 开头的奇怪的宏。还有例如ASCII, DBCS, Unicode编码方式。

这里先解释一下关于字符的基础问题。所有的 string 类都是以C-style字符串为基础的。在操作系统中字符分代码页按照代码映射表示不同语言的符号,不同的语言可能使用不同的代码页。例如,ANSI 代码页 1252 用于英语和大多数欧洲语言,而 ANSI 代码页 932 则用于日本汉字。实际上,所有代码页都共享 ASCII 字符集中最低的 128 个字符(0x00 到 0x7F)。系统存在三种编码方式,ASCII, DBCS和 Unicode。ASCII 字符集只有256个字符,用 0-255 之间的数字来表示。包括大小写字母、数字以及少数特殊字符;如标点符号、货币符号等。对于大多数拉丁语言来说,这些字符已经够用。但是,许多亚洲和东方语言所用的字符远远不止256个字符。有些超过千个。人们为了突破 ASCII 码字符数的限制,试图用一种简单的方法来针对超过256个字符的语言编写计算机程序。于是 UNICODE 应运而生。UNICODE 通过用双字节来表示一个字符,从而在更大范围内将数字代码映射到多种语言的字符集。第一种编码类型是单子节字符集(single-byte character set or SBCS)。在这种编码模式下,所有的字符都只用一个字节表示。ASCII是SBCS。一个字节表示的0用来标志SBCS字符串的结束。第二种编码模式是多字节字符集(multi-byte character set or MBCS)。一个MBCS编码包含一些一个字节长的字符,而另一些字符大于一个字节的长度。用在Windows里的MBCS包含两种字符类型,单字节字符(single-byte characters)和双字节字符(double-byte characters)。由于Windows里使用的多字节字符绝大部分是两个字节长,所以MBCS常被用DBCS代替。在DBCS编码模式中,一些特定的值被保留用来表明他们是双字节字符的一部分。例如,在Shift-JIS编码中(一个常用的日文编码模式),0x81-0x9f之间和 0xe0-oxfc之间的值表示"这是一个双字节字符,下一个子节是这个字符的一部分。"这样的值被称作"leading bytes",他们都大于0x7f。跟随在一个leading byte子节后面的字节被称作"trail byte"。在DBCS中,trail byte可以是任意非0值。像SBCS一样,DBCS字符串的结束标志也是一个单字节表示的0。第三种编码模式是Unicode。Unicode是一种所有的字符都使用两个字节编码的编码模式。Unicode字符有时也被称作宽字符,因为它比单子节字符宽(使用了更多的存储空间)。注意,Unicode不能被看作MBCS。MBCS的独特之处在于它的字符使用不同长度的字节编码。Unicode字符串使用两个字节表示的0作为它的结束标志。在 Visual C++ 中,MBCS 始终是指 DBCS。不支持比两个字节宽的字符集。
如何选择这三种编码方式。对于想使你的程序国际化的程序员,这里给出一点建议,如果你想在win2000或更高平台上运行,请选择unicode编码,这样能换取更好效率,因为win2000底层的api是基于unicode编码,如果选择别的编码方式,性能会在转换编码的时候有所损失,如果你想运行在win9x、win2000等时,选择MBCS 。但此时需注意程序中对字符的操作,必须对字符进行操作,切勿对字节进行操作,因为MBCS 情况下你不知道是否是双字节形式,这里对于mfc类的方法基本都是基于字符操作的。另外为获得灵活性,尽可能地使用运行时宏(如 _tcschr_tcscpy)。
说明
1.在COM里面只支持UNICODE。
2.Windows 2000整个OS系统都是基于UNICODE的,为此在windows 2000下使用ANSI是需要付出代价的,虽然在编码上不用任何的转换,但是这种转化是隐藏的,是占用系统资源的(CPU,内存)。
3.在Windows 98下必须使用UNICODE,则需要自己手动的编码切换
Windows 98 :只支持ANSI。
Windows 2k :既支持ANSI又支持UNICODE。
Windows CE :只支持UNICODE。

名词解释:
代码页:在UNICODE和DBCS中由于包含的代码十分多,为了使用方便就需要对这些代码进行组织。组织的方法就是把不同国家的代码分别放入不同的代码页。字符集与代码页的关系:由上可知,对于UNICODE和DBCS,代码页是从属于字符集的。但对于SBCS类的字符集(比如ANSI)和DBCS之外的MBCS字符集(比如GB2312等)他们则只对应于一个代码页。

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值