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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章