1. 程式人生 > >Ansi與Unicode編碼的轉換及佔用位元組數

Ansi與Unicode編碼的轉換及佔用位元組數

①、Ansi與Unicode簡要說明及各自的優缺點:


他們是兩種字元的編碼格式,Ansi=窄位元組,Unicode=寬位元組,Ansi用char格式表示一個字元,佔用一個位元組的儲存空間,最多表示255個字元,表示英文還可以,但對於中文、日文、韓文等語言來說就不夠用了,所以如果你的程式是Ansi編碼的話,那麼你寫的中文語言的程式拿到日文、韓文等系統上面就會出現亂碼。所以有了Unicode,用二個位元組去表示一個字元,被定義成 wchar_t 格式這樣就可以表示世界上絕大多數的語言了!但有利就有弊,缺點呢? 就是空間佔用翻倍了,網路傳輸的資料量也增大了……

  Ansi 窄位元組,Unicode寬位元組   

  Unicode可以表示世界上的大多數語言,國際化。但是佔用兩個位元組,網路傳輸不方便。

②、不同編碼格式下的字串處理及相互轉化:

         /************************************************************************/
	/* ANSI 窄位元組
	/************************************************************************/
	/*
	char a_char_1[10] = "MFC";
	char *a_char_2 = "MFC";
	PCHAR a_char_3 = "MFC";
	PSTR a_char_4 = "MFC";
	PCSTR a_char_5 = "MFC";
	LPSTR a_char_6 = "MFC";
	LPCSTR a_char_7 = "MFC";
	*/

	/************************************************************************/
	/* UNICODE 寬位元組
	/************************************************************************/
	/*
	wchar_t w_char_1[10] = L"MFC";
	wchar_t *w_char_2 = L"MFC";
	WCHAR *w_char_3 = L"MFC";
	PWCHAR w_char_4 =  L"MFC";
	PWSTR w_char_5 =  L"MFC";
	LPWSTR w_char_6 =  L"MFC";
	LPCWSTR w_char_7 =  L"MFC";
	*/
	/************************************************************************/
	/* T 通用型別                                           
	/************************************************************************/
	/*
	TCHAR t_char_1[10] = _T("MFC");
	PTSTR t_char_2 = _T("MFC");
	LPTSTR t_char_3 = _T("MFC");
	LPCTSTR t_char_4 = _T("MFC");
	*/
	

	

   以上,其中:P代表指標的意思,STR代表字串的意思,L是長指標的意思,C代表const常量的意思,W代表wide寬位元組的意思,T可以理解為通用型別的意思.

不同編碼格式下的字串處理及相互轉化:

         /************************************************************************/
	/* 1:窄位元組轉換成寬位元組(使用系統API函式)
	/* 2:寬位元組轉成窄位元組 (使用系統API函式)
	/************************************************************************/
	/*
	char  *mChar = "MFC";
	TCHAR *mResult = AnsiToWideChar(mChar);
	delete []mResult;
	*/
	
	/*
	TCHAR *mChar = L"MFC";
	char *mResult = WideCharToAnsi(mChar);
	delete []mResult;
	*/

char *WideCharToAnsi(wchar_t *pWideChar)
{
	if(!pWideChar) return NULL;
	char *ansiChar = NULL;
	int needChar = WideCharToMultiByte(CP_ACP,0,pWideChar,-1, NULL, 0, NULL, NULL);
	if (needChar > 0)
	{
		needChar += 1;
		ansiChar = new char[needChar];
		ZeroMemory(ansiChar,needChar);
		WideCharToMultiByte(CP_ACP,0,pWideChar,-1, ansiChar, needChar, NULL, NULL);
	}
	return ansiChar;
}

wchar_t *AnsiToWideChar(char *pChar)
{
	if(!pChar) return NULL;
	wchar_t *wideChar = NULL;
	int needChar = MultiByteToWideChar(CP_ACP, 0, pChar, -1, NULL, 0);
	if (needChar > 0)
	{
		needChar += 1;
		wideChar = new wchar_t[needChar];
		ZeroMemory(wideChar, needChar*sizeof(wchar_t));
		MultiByteToWideChar(CP_ACP, 0, pChar, -1, wideChar, needChar);
	}
	return wideChar;
}

④、A2W、W2A、T2A、T2W 巨集的使用以及注意事項
 

 char  *mChar = "MFC";
 USES_CONVERSION;
 TCHAR *mResult = A2W(mChar);

不要在一個函式的迴圈體中使用 A2W 等字元轉換巨集,可能引起棧溢位

⑤、字串佔用位元組數:

● Ansi:
char szStr[] = "abc";
佔用位元組數求法:sizeof(szStr);

char *psz = "defgh";
佔用位元組數求法:strlen(psz)*sizeof(char);

● Unicode:
wchar_t szwStr[] = L"abc";
佔用位元組數求法:sizeof(szwStr);

wchar_t *pwsz = L"defgh";
佔用位元組數求法:wcslen(pwsz)*sizeof(wchar_t);

● 通用函式:
TCHAR szStr[] = _T("abc");
佔用位元組數求法:sizeof(szStr);

TCHAR *psz = _T("defgh");
佔用位元組數求法:_tcslen(psz)*sizeof(TCHAR);