char, wchar_t, TCHAR 字符全總結 & c++字符串操作經驗集

字符類型、字符指針類型、字符串字面值

字符類型:

    char, wchar_t, CHAR, WCHAR, TCHAR, UCHAR, BYTE, TBYTE

    char          是C語言標準數據類型,字符型。通常由編譯器決定一個char對象有多少個字節組成,一般是一字節。

    wchar_t    是char的Unicode版本。相當於 unsigned short。一般兩個字節。

    CHAR       參照定義: typedef   char           CHAR;

    WCHAR    參照定義:typedef    wchar_t     WHAR;

    TCAHR     通用版字符類型:在ANSI編譯方式下爲 char , 在Unicode 編譯方式下爲 wchar_t。

    UCHAR    相當於unsigned char

    BYTE       相當於unsigned char。在取得字符編碼(00 - FF)時,非常有用。

    TBYTE     通用版字符類型:在ANSI編譯方式下爲 char , 在Unicode 編譯方式下爲 wchar_t。

    參照 tchar.h頭文件定義:

// _UNICODE 版

#ifndef	__TCHAR_DEFINED
typedef	wchar_t		_TCHAR;
typedef	wchar_t		_TSCHAR;
typedef	wchar_t		_TUCHAR;
typedef	wchar_t		_TXCHAR;
#define  __TCHAR_DEFINED
#endif

typedef	wchar_t		TCHAR;

//	非_UNICODE 版

#ifndef	__TCHAR_DEFINED
typedef	char                 _TCHAR;
typedef	signed char          _TSCHAR;
typedef	unsigned char        _TUCHAR;
typedef	char                 _TXCHAR;
#define	__TCHAR_DEFINED
#endif

typedef	char		TCHAR;

 

// 字符定義總結如下: 

自適應		非UNICODE                 UNICODE
_TCHAR		char                    wchar_t
_TSCHAR		signed char             wchar_t
_TUCHAR		unsigned char           wchar_t
_TXCHAR		char                    wchar_t
TCHAR		char                    wchar_t

 


字符指針類型:

PSTR,PWSTR,通用版: PTSTR,PTCH          

LPSTR,LPWSTR,通用版:LPTSTR  , LPTCH

               typedef CHAR                 *PSTR,         *LPSTR;

               typedef WCHAR              *PWSTR,     *LPWSTR;

 

PCSTR,PCWSTR,通用版:PCTSTR    

 LPCSTR,LPCWSTR,通用版:LPCTSTR

               typedef CONST CHAR    *PCSTR,      *LPCSTR;

               typedef CONST WCHAR *PCWSTR,  *LPCWSTR;

解釋                           通用版                  非UNICODE           UNICODE  
字符定義                       TCHAR                CHAR               WCHAR  
字符指針                       PTCHAR               CHAR *             WCHAR *  
字符串指針                     LPTCH & PTCH         LPSTR & PSTR       LPWSTR & PWSTR  
字符串指針                     LPTSTR & PTSTR       LPSTR & PSTR       LPWSTR & PWSTR  
靜態字符串指針                 LPCTSTR & PCTSTR     LPCSTR & PCSTR     LPCWSTR & PCWSTR  

 

字符串字面值:

參照tchar.h頭文件如下定義:

 

// _UNICODE 版
#define	__T(x)		L ## x
//	非_UNICODE 版
#define	__T(x)		x

// -----------------------------------------
#define	 _T(x)            __T(x)
#define  _TEXT(x)         __T(x)

// 總結如下:
// 字符串字面值表示:
// 非UNICODE:      " "
// UNICODE  :     L" "

// 字符串字面值表示,總結如下: 

通用        非UNICODE           UNICODE
__T(x)            x               L ## x
_T(x)             x               L ## x
_TEXT(x)          x               L ## x


參照winnt.h頭件如下定義:

#ifdef     UNICODE                       // 以下是Unicode相關定義  
#define    __TEXT(quote)    quote        // 定義字符串常量宏  
#endif     /* UNICODE */

#define    TEXT(quote)      __TEXT(quote)// 定義另一個字符串常量宏 
字符串表示                     __TEXT(quote)        quote              L ## quote
字符串表示                     TEXT(quote)          quote              L ## quote

 

c++字符串操作經驗集


 字符串處理函數總結:

標準c中的strcpy,strchr,strcat等只能用於ANSI字符串,不能正確處理Unicode字符串,因此也提供了一組補充函數,功能等價,但用於Unicode碼。

我們來看看string .h字符串頭文件中是怎樣處理char*和wchar_t*兩個字符串版本的:

char        *strcat(char*,const char*);

wchar_t *wcschr(wchat_t*,const wchar_t *)

類似的還有strchr/wcschr,strcmp/wcscmp,strlen/wcslen...

ANSI        操作函數以str開頭         strcpy

Unicode   操作函數以wcs開頭       wcscpy

MBCS      操作函數以_mbs開頭    _mbscpy

ANSI/Unicode 操作函數以_tcs開頭 _tcscpy(C運行期庫)

ANSI/Unicode 操作函數以lstr開頭 lstrcpy(Windows函數)

 

各種字符串處理函數庫

1 C運行庫對字符串的處理:

str*系列:    C運行庫早期使用strlen strcpy等str*系列函數對char類型的字符串進行處理。
wcs*系列:   C編譯器內置了wchar_t這個16位寬字節類型後,使用新的wcslen wcscpy等wcs*系列的函數對wchar_t類型的字符串進行處理。
_tcs*系列:  C運行庫定義了宏_tcslen _tcscpy等_tcs*系列的宏定義,_tcs*系列函數在編譯時根據是否預定義了宏_UNICODE而確定是採用wcs*系列函數,否則採用str*系列函數。

_tcs*_s系列:  C運行庫的最新安全字符串函數,爲了防止緩衝區溢出而定義的新函數。


2 windows對字符串的處理:

Windows開發團隊在winnt.h中定義了新的數據類型CHAR(char), WCHAR(wchar_t), TCHAR,TCHAR最終在編譯時根據是否預定義了UNICODE宏而確定是CHAR還是WCHAR。

lstr*a系列:  在windows操作系統的Kernel32.dll中定義,處理CHAR類型的字符串,其實是對lstr*w的一層包裝。
lstr*w系列: 在windows操作系統的Kernel32.dll中定義,處理WCHAR類型的字符串。
lstr*系列:   lstr*系列函數也是在編譯時才根據是否預定義了UNICODE宏來確定採用lstr*a系列函數,還是lstr*w系列函數。

個人推薦用lstr*系列,因爲這個是windows api,這樣寫出來的程序不用把C運行庫鏈接進來。


有個需要注意的是,C運行庫的_UNICODE和Windows的UNICODE,兩個宏,要麼同時定義,要麼同時不定義。C運行庫前綴下劃線是爲了遵守那個該死的C++標準(對於不屬於C++標準的宏加下劃線),而Windows沒有遵守那個標準

 

字符(串)之間的轉換

1.使用ATL的字符串轉換宏,可以實現不同類型的字符串轉換。

      在宏名稱裏面,分別用A,W,T代表ANSI字符串,Unicode字符串,以及TCHAR字符串。

     並分別用CA,CW,CT來代表相應的const字符串。

     對ANSI字符串進行轉換操作的宏有A2W,A2T,A2CW,A2CT。

     對Unicode字符串進行轉換操作的宏有W2A,W2T,W2CA,W2CT。

     對TCHAR字符串進行轉換操作的宏有T2W,T2A,T2CW,T2CA。

*需要注意的是: 在使用以上宏的時候,必須在程序中定義如下宏,

USES_CONVERSION;

2. 字符串與其他類型之間的轉換

字符串和INT的相互轉換

通過atoi,_wtoi,_ttoi可以分別把ANSI,Unicode和TCHAR字符串轉換成INT。

通過_itoa,_itow,_itot可以分別把INT轉換成ANSI,Unicode和TCHAR字符串。

字符串和LONG的相互轉換

通過atol,_wtol,_ttol可以分別把ANSI,Unicode和TCHAR字符串轉換成LONG

通過_ltoa,_ltow,_ltot可以分別把INT轉換成ANSI,Unicode和TCHAR字符串。

字符串和DOUBLE的相互轉換

通過atof,_wtof,_ttof可以分別把ANSI,Unicode和TCHAR字符串轉換成DOUBLE

通過_fcvt 可以把DOUBLE數值轉換爲ANSI字符串。

ANSI 和 UNICODE 的函數對應表

ANSI          UNICODE     通用

(char.h)      (wchar.h)        (tchar.h)

char           wchar_t          TCHAR
char *        wchar_t *        PTCHAR (PTSTR,LPWSTR,PWSTR,WCHAR)

printf         wprintf              _tprintf
scanf         wscanf             _tscanf

atoi           _wtoi                _ttoi
atol           _wtol                _ttol
itoa           _itow                _itot
ltoa           _ltow                _ltot

atof           _wtof               _tstof

strlen         wcslen            _tcslen
strcat         wcscat            _tcscat
strcpy        wcscpy           _tcscpy
strcmp       wcscmp          _tcscmp

 

 

 附:C語言字符串函數詳解 strcpy、strcmp、strcat、strlen、strstr

            http://write.blog.csdn.net/postedit/7300418

 

            atoi, itoa 字符串轉換函數源代碼

            http://blog.csdn.net/ltag0110rtag/article/details/7363919

 

 

 

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