1. 程式人生 > >轉碼(常用型別和字元轉換)

轉碼(常用型別和字元轉換)

一、轉碼之前需要明白,你轉之前的碼是什麼,你轉之後的碼是什麼?

轉言之就是下面兩個問題:

1、我們定義的是類還是,資料型別?

2、定義的資料型別是什麼編碼?(別給我說是unicode)

二、類or資料型別?

先來說第一個:

我們經常會遇到類似與CString、string、wstring、char *(char str[]後面就不寫這個了,也就是CHAR),wchar_t *、WCHAR *、LPCTSTR 等等。(F12可以看到最根本的資料型別差不多就是char、WCHAR、wchar_t 這三種)

那麼我們明確下我們到底要轉的是什麼,轉到的型別到底是啥?轉的是一個“類”,還是資料型別,你要轉的目標是類還是資料型別。

(1)string(連結是百度百科)

但是string的定義不認為是對的,我認為是個容器,本質就是一個設計好的類。而我們要轉的是裡面的是類裡面的字串(char *)。

std::string str ("Please split this sentence into tokens");
char * cstr = new char [str.length()+1]; 
std::strcpy (cstr, str.c_str()) ;
//……
delete[] cstr;

(2)wstring百度百科上沒有了,不誤人子弟了

其實點選連結就可以差不多明白了。我在這小結下。

 wstring 就是以wchar_t作為字元型別,其餘的和string差不多。

F12 MFC atlstr.h

1111 行開始 
我們可以看到(先看下面)

#ifndef _ATL_CSTRING_NO_CRT
typedef CStringT< wchar_t, StrTraitATL< wchar_t, ChTraitsCRT< wchar_t > > > CAtlStringW;
typedef CStringT< char, StrTraitATL< char, ChTraitsCRT< char > > > CAtlStringA;
typedef CStringT< TCHAR, StrTraitATL< TCHAR, ChTraitsCRT< TCHAR > > > CAtlString;
#else  // _ATL_CSTRING_NO_CRT

typedef CStringT< wchar_t, StrTraitATL< wchar_t > > CAtlStringW;
typedef CStringT< char, StrTraitATL< char > > CAtlStringA;
typedef CStringT< TCHAR, StrTraitATL< TCHAR > > CAtlString;
#endif  // _ATL_CSTRING_NO_CRT

#ifndef _AFX
typedef CAtlStringW CStringW;
typedef CAtlStringA CStringA;
typedef CAtlString CString;
#endif

CStringT 再次F12 轉到 cstringt.h 

看到這裡是不是似曾相識燕歸來的感覺。

先看個list容器的實現 , 為啥要看這個。仔細瞅瞅就會發現,其實這玩意就是個 容器 。或者說是“封裝好的過載的類”。首先是個類,其實和過載的函式,說是封裝,因為你除非重寫,不然就只能直接用了。

接下里看下不同的引數。三個資料型別分別是:wchar_t、char、TCHAR。前面個兩個好理解,但是第三個是啥,別急,我給你個它的另一個寫法WCHAR(wchar_t)

L表示long指標 
      這是為了相容Windows  3.1等16位作業系統遺留下來的,在win32中以及其他的32為作業系統中,  long指標和near指標及far修飾符都是為了相容的作用。沒有實際意義。

P表示這是一個指標;

C表示是一個常量;

T表示在Win32環境中,  有一個_T巨集,

這個巨集用來表示你的字元是否使用UNICODE,  如果你的程式定義了UNICODE或者其他相關的巨集,那麼這個字元或者字串將被作為UNICODE字串,否則就是標準的ANSI字串;

STR表示這  個變數是一個字串。

所以LPCTSTR就表示一個指向常固定地址的可以根據一些巨集定義改變語義的字串。同樣,  LPCSTR就只能是一個ANSI字串,在程式中我們大部分時間要使用帶T的型別定義

-----這個稍後補充