string

1、字符集(ASCII字符集、GBXXXX字符集、Unicode字符集)

1.1、ASCII字符集(ASCII编码方案、EASCII编码方案)

1.1.1、ASCII编码方案

说明:美国信息交换标准代码

优点:7位字符集广泛用于代表标准美国键盘上的字符或符号。

缺点:只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语。

1.1.2、EASCII编码方案


1.2、GBXXXXX字符集(GB2312编码方案、GBK编码方案、GB18030编码方案、Big5编码方案)

1.2.1、GB2312编码方案

说明:信息交换用汉字编码字符集·基本集 

详细:天朝专家把那些127号之后的奇异符号们(即EASCII)取消掉,规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。

1.2.2、GBK编码方案

说明:非国家标准

1.2.3、GB18030编码方案

优点:与UTF-8相同,采用多字节编码,每个字可以由1个、2个或4个字节组成。

1.2.4、Big5编码方案

说明:又称为大五码或五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准。详细:是一套双字节字符集,使用了双八码存储方法,以两个字节来安放一个字。第一个字节称为"高位字节",第二个字节称为"低位字节"。"高位字节"使用了0x81-0xFE,"低位字节"使用了0x40-0x7E,及0xA1-0xFE。

1.3、Unicode字符集

说明:Unicode编码系统为表达任意语言的任意字符而设计。它使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph)。每个数字代表唯一的至少在某种语言中使用的符号。

1.3.1、UTF-32编码方案

说明:使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph),每个数字代表唯一的至少在某种语言中使用的符号的编码方案。

优点:可以在常数时间内定位字符串里的第N个字符,因为第N个字符从第4×Nth个字节开始。

缺点:就空间而言,是非常没有效率的。

1.3.2、UTF-16编码方案

说明:Unicode编码系统为表达任意语言的任意字符而设计。它使用4字节的数字来表达每个字母、符号,或者表意文字。

优点:它在空间效率上比UTF-32高两倍,因为每个字符只需要2个字节来存储(除去65535范围以外的),而不是UTF-32中的4个字节。并且,如果我们假设某个字符串不包含任何星芒层中的字符,那么我们依然可以在常数时间内找到其中的第N个字符,直到它不成立为止这总是一个不错的推断。

1.3.3、UTF-8编码方案

说明:一种针对Unicode的可变长度字符编码(定长码),也是一种前缀码。

详细:UTF-8使用一至四个字节为每个字符编码: 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码(Unicode范围由U+0080至U+07FF)。 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字)使用三个字节编码。其他极少使用的Unicode辅助平面的字符使用四字节编码。

优点:UTF-8是ASCII的一个超集。因为一个纯ASCII字符串也是一个合法的UTF-8字符串,所以现存的ASCII文本不需要转换。为传统的扩展ASCII字符集设计的软件通常可以不经修改或很少修改就能与UTF-8一起使用。使用标准的面向字节的排序例程对UTF-8排序将产生与基于Unicode代码点排序相同的结果。(尽管这只有有限的有用性,因为在任何特定语言或文化下都不太可能有仍可接受的文字排列顺序。)UTF-8和UTF-16都是可扩展标记语言文档的标准编码。所有其它编码都必须通过显式或文本声明来指定。任何面向字节的字符串搜索算法都可以用于UTF-8的数据(只要输入仅由完整的UTF-8字符组成)。但是,对于包含字符记数的正则表达式或其它结构必须小心。UTF-8字符串可以由一个简单的算法可靠地识别出来。就是,一个字符串在任何其它编码中表现为合法的UTF-8的可能性很低,并随字符串长度增长而减小。举例说,字符值C0,C1,F5至FF从来没有出现。为了更好的可靠性,可以使用正则表达式来统计非法过长和替代值(可以查看W3 FAQ: Multilingual Forms上的验证UTF-8字符串的正则表达式)。

缺点:因为每个字符使用不同数量的字节编码,所以寻找串中第N个字符是一个O(N)复杂度的操作 即,串越长,则需要更多的时间来定位特定的字符。同时,还需要位变换来把字符编码成字节,把字节解码成字符。

2、字符串

2.1、string

我们先看string的本质:typedef basic_string<char, char_traits<char>, allocator<char> > string;
由此我们可以看看basic_string 到底是什么样子

2.2、basic_string

template<class _Elem, class _Traits, class _Ax>
class basic_string{};     
我们可以再看看wstring

2.3、wstring

typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
这样看来我们可以自己构造tstring

2.4、tstring

typedef basic_string<TCHAR, char_traits<TCHAR>, allocator<TCHAR> > tstring;
那么问题来了TCHAR到底是什么东东

2.5、TCHAR、char、wchar_t(字符)

首先我们要知道c++支持俩套字符集:ANSI和Unicode, 而俩套字符集对应的字符分别是char和wchar_t
那么TCHAR是什么?
在c语言中 ifdef _UNICODE,在Windows中 ifdef UNICODE,则 TCHAR = wchar_t;如果不定义这俩个宏, 则TCHAR = char。
同样的道理适应于函数的定义:_tcslen strlen wstrlen
这样会不会使你想查查其他的:_tcsXXX strXXX wstrXXX

2.6、LPTSTR、LPSTR、LPWSTR(字符串)

类型          ANSI                     Unicode
TCHAR         char                     char
WCHAR         wchar_t                  wchar_t
LPSTR         char*                    char*
LPCSTR        const char*              const char*
LPWSTR        wchar_t*                 wchar_t*
LPCWSTR       const wchar_t*           const wchar_t*
LPTSTR        char*                    wchar_t*
LPCTSTR       const char*              const wchar_t*

细心的同学应该看到什么了, 对没错就如同你看到的
LP:指针; C:const; W:宽字符(Unicode); T:用上面所说的宏UNICODE来适应

2.7、BSTR、_bstr_t、CComBSTR

string        ansi字符串
wstring       unicode字符串
tstring       兼容Ansi和unicode
CString       mfc字符串类              MFC对兼容unicode的封装 
BSTR                                   多用在IDL中,作为标准接口对外兼容各类语言的使用者
_bstr_t       com字符串                多用在c++ 的实现和使用,既有MFC也有标准C++包含comdef.h  OLEAUT32.LIB OLEAUT32.dll
CComBSTR      Atl字符串                多用在atl 的组件实现和使用方面,包含atlbase.h  atl.lib  atl.dll

_bstr_t:IDL中使用多用在使用组件时,非MFC程序也可以使用。_bstr_t实际上是将char wchar_t BSTR转换为wchar_t*;同时又可以转换为 char wchar_t BSTR。注意:里面的转换函数使用的是标准c++

CComBSTR:多用在atl的组件实现和使用方面,CcomBSTR实际上是也是将非BSTR转换为BSTR的副本但不支持转换为其它非BSTR类型。注意:里面的转换函数使用的是win api

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值