当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

C++字符串完好指引之一:Win32 字符编码[VC/C++编程]

赞助商链接



  本文“C++字符串完好指引之一:Win32 字符编码[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

引言

毫无疑问,我们都看到过像 TCHAR, std::string, BSTR 等各种各样的字符串范例,还有那些以 _tcs 开首的奇特的宏.你大概正在盯着显示器哀愁.本指引将总结引进各种字符范例的目的,展示一些简单的用法,并奉告您在必要时,若何实现各种字符串范例之间的转换.

在第一部份,我们将介绍3种字符编码范例.理解各种编码情势的工作方法是很重要的事情.即便你已经知道一个字符串是一个字符数组,你也应当阅读本部份.一旦你理解了这些,你将对各种字符串范例之间的关系有一个清楚地理解.

在第二部份,我们将单独报告string类,怎样利用它及实现他们彼此之间的转换.

字符底子 -- ASCII, DBCS, Unicode

全部的 string 类都是以C-style字符串为底子的.C-style 字符串是字符数组.所以我们先介绍字符范例.这里有3种编码情势对应3种字符范例.第一种编码范例是单子节字符集(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作为它的完毕标志.

单字节字符包含拉丁文字母表,accented characters及ASCII尺度和DOS操作系统定义的图形字符.双字节字符被用来表示东亚及中东的语言.Unicode被用在COM及Windows NT操作系统内部.

你一定已经很熟习单字节字符.当你利用char时,你处理的是单字节字符.双字节字符也用char范例来举行操作(这是我们将会看到的关于双子节字符的很多奇特的地方之一).Unicode字符用wchar_t来表示.Unicode字符和字符串常量用前缀L来表示.比方:wchar_t wch = L''1''; // 2 bytes, 0x0031
wchar_t* wsz = L"Hello"; // 12 bytes, 6 wide characters

字符在内存中是怎样存储的

单字节字符串:每个字符占一个字节按次序顺次存储,最后以单字节表示的0完毕.比方."Bob"的存贮情势以下:

42 6F 62 00
B o b BOS

Unicode的存储情势,L"Bob"

42 00 6F 00 62 00 00 00
B o b BOS

利用两个字节表示的0来做完毕标志.

一眼看上去,DBCS 字符串很像 SBCS 字符串,但是我们一会儿将看到 DBCS 字符串的奇妙之处,它使得利用字符串操作函数和永字符指针遍历一个字符串时会产生意料之外的后果.字符串" " ("nihongo")在内存中的存储情势以下(LB和TB辨别用来表示 leading byte 和 trail byte)

93 FA 96 7B 8C EA 00
LB TB LB TB LB TB EOS
EOS

值得注意的是,"ni"的值不能被注释成WORD型值0xfa93,而应当看做两个值93和fa以这种次序被作为"ni"的编码.


  以上是“C++字符串完好指引之一:Win32 字符编码[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

本文地址: 与您的QQ/BBS好友分享!
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .