C語言/C++程序員編程學(xué)習(xí)之unicode編碼與ansi編碼

C語言是面向過程的,而C++是面向?qū)ο蟮?/p>

C和C++的區(qū)別:

C是一個結(jié)構(gòu)化語言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過一個過程,對輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。

C++,首要考慮的是如何構(gòu)造一個對象模型,讓這個模型能夠契合與之對應(yīng)的問題域,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個概念已經(jīng)被融入到C++之中 ”。

C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計(jì)這個概念已經(jīng)被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯!算法是程序設(shè)計(jì)的基礎(chǔ),好的設(shè)計(jì)如果沒有好的算法,一樣不行。而且,“C加上好的設(shè)計(jì)”也能寫出非常好的東西。

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 六九九,四七零,五九六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

在學(xué)習(xí)字符串時一定會碰到CString的字符串要轉(zhuǎn)換為char*的問題,在此總結(jié)一下unicode工程下的字符串處理問題。

Ansi與Unicode簡要說明及各自的優(yōu)缺點(diǎn)。

他們是兩種字符的編碼格式,Ansi表示窄字節(jié),Unicode表示寬字節(jié),Ansi用char格式表示一個字符,占用一個字節(jié)的存儲空間,最多表示255個字符,表示英文還可以,但對于中文、日文、韓文等語言來說就不夠用了,所以如果你的程序是Ansi編碼的話,那么你寫的中文語言的程序拿到日文、韓文等系統(tǒng)上面就會出現(xiàn)亂碼。所以有了Unicode,用二個字節(jié)去表示一個字符,格式是 unsigned short,被定義成 wchar_t 格式這樣就可以表示世界上絕大多數(shù)的語言了!但有利就有弊,缺點(diǎn)呢?就是空間占用翻倍了,網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量也增大了。

Windows 2000 及其以后的 Xp、2003、Vista、Win7 等系統(tǒng)都是使用Unicode從頭進(jìn)行開發(fā)的,如果調(diào)用任何一個Windows API 函數(shù)并給它傳遞一個 ANSI 字符串,那么系統(tǒng)首先要將字符串轉(zhuǎn)換成Unicode,然后將Unicode字符串傳遞給操作系統(tǒng)。如果希望函數(shù)返回ANSI字符串,系統(tǒng)就會先將Unicode字符串轉(zhuǎn)換成ANSI字符串,然后將結(jié)果返回給你的應(yīng)用程序。進(jìn)行這些字符串的轉(zhuǎn)換需要占用系統(tǒng)的時間和內(nèi)存。為了避免系統(tǒng)轉(zhuǎn)換消耗的資源通常都使用unicode。

不同編碼格式下的字符串處理及相互轉(zhuǎn)化。

在編程時經(jīng)常遇到的數(shù)據(jù)類型:

Ansi:

char、char * 、const char *

CHAR、(PCHAR、PSTR、LPSTR)、LPCSTR

Unicode:

wchar_t、wchar_t * 、const wchar_t *

WCHAR、(PWCHAR、PWSTR、LPWSTR)、LPCWSTR

T 通用類型:

TCHAR、(TCHAR * 、PTCHAR、PTSTR、LPTSTR)、LPCTSTR

以上,其中:P代表指針的意思,STR代表字符串的意思,L是長指針的意思,在WIN32平臺下可以忽略,C代表const常量的意思,W代表wide寬字節(jié)的意思,T表示模板,也就是通用的意思,在使用時系統(tǒng)會根據(jù)當(dāng)前的工程性質(zhì)進(jìn)行轉(zhuǎn)換。例如在unicode下,TCHAR其實(shí)就是wchar_t,否則就被定義成char。

字符串類型的對象的定義:

Ansi:char *pAnsiStr = "hello";

Unicode:wchar_t *pUnicodeStr = "hello";

通用類型:TCHAR *pTStr = _T("hello"); 或者 TCHAR *pTStr = _TEXT("hello");(_T,_TEXT是一個意思)

動態(tài)申請內(nèi)存:TCHAR *pszBuf = new TCHAR[100];

Ansi 與 Unicode 字符串類型的互相轉(zhuǎn)換:

上面給大家介紹的都是窄字節(jié)就是窄字節(jié),寬字節(jié)就是寬字節(jié),那么下面就給大家介紹下他們兩個之間的轉(zhuǎn)換。

在程序中還是不建議大家來回來去的進(jìn)行字符串編碼的轉(zhuǎn)換,要么就都使用Ansi,要么就都使用Unicode,

但是呢,往往有些 API 函數(shù)只提供了窄字節(jié)版本(比如:GetProcAddress,見MSDN)或者只提供寬字節(jié)版本(比如:CommandLineToArgvW,見MSDN),

這個時候就要進(jìn)行字符串編碼格式的轉(zhuǎn)換了。

但是,這里提醒下大家,不是所有的都需要轉(zhuǎn)換,有一些是不需要轉(zhuǎn)換的,比如 socket 中的 send 或者 recv 函數(shù).

字符串占用字節(jié)數(shù):

Ansi:

char szStr[] = "abc";

占用字節(jié)數(shù)求法:sizeof(szStr);

char *psz = "defgh";

占用字節(jié)數(shù)求法:strlen(psz)*sizeof(char);

Unicode:

wchar_t szwStr[] = L"abc";

占用字節(jié)數(shù)求法:sizeof(szwStr);

wchar_t *pwsz = L"defgh";

占用字節(jié)數(shù)求法:wcslen(pwsz)*sizeof(wchar_t);

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 六九九,四七零,五九六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

通用函數(shù):

TCHAR szStr[] = _T("abc");

占用字節(jié)數(shù)求法:sizeof(szStr);

TCHAR *psz = _T("defgh");

占用字節(jié)數(shù)求法:_tcslen(psz)*sizeof(TCHAR);

轉(zhuǎn)換用到的最根本的 API 函數(shù):

WideCharToMultiByte 實(shí)現(xiàn)寬字節(jié)轉(zhuǎn)換到窄字節(jié)

MultiByteToWideChar 實(shí)現(xiàn)窄字節(jié)轉(zhuǎn)換到寬字節(jié)

A2W、W2A、T2A、T2W 宏的使用以及注意事項(xiàng):

其實(shí)這些宏根本上還是用到了上面的兩個函數(shù)。

[1]、這些函數(shù)都是在棧中分配空間的。例如:A2W("abc"),就會在棧中分配一塊內(nèi)存存放'abc'

[2]使用上面的宏之前都要使用USES_CONVERSION宏

*unicode下CString與char*的轉(zhuǎn)換:

CString轉(zhuǎn)換為char*:使用wcstombs()函數(shù)

例子:

CString str;

str="你好,hello";

char ch[50];

wcstombs(ch,str,siezof(ch));

這樣的轉(zhuǎn)換會出現(xiàn)問題,原因是str帶有中文,如果帶有中文還在之前使用setlocale(LC_ALL,""),要包含頭文件;設(shè)置一下默認(rèn)語言。

char*轉(zhuǎn)換為CString:使用A2T()函數(shù):

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 六九九,四七零,五九六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

例子:

USES_CONVERSION;

char ch[5]="what";

CString str;

str=A2T(ch);

~~~end~~~

這些是C/C++能做的

服務(wù)器開發(fā)工程師、人工智能、云計(jì)算工程師、信息安全(黑客反黑客)、大數(shù)據(jù) 、數(shù)據(jù)平臺、嵌入式工程師、流媒體服務(wù)器、數(shù)據(jù)控解、圖像處理、音頻視頻開發(fā)工程師、游戲服務(wù)器、分布式系統(tǒng)、游戲輔助等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容