作vc++開發免不了多字節UNICODE、UTF-8轉來轉去,下面貼出我寫的幾個字符轉化函數c++
一、 TCHAR 和CHAR轉化, TCHAR 對應UNICODE和多字節下分別是WCHAR 和CHAR 函數以下:ide
須要注意*dest是new出來的須要釋放函數
//char 字符串轉化爲tchar字符串 void C2T(TCHAR** dest, const char* src) { #ifdef _UNICODE if (src == NULL) { return ; } size_t alen = strlen(src) + 1; size_t ulen = (size_t)MultiByteToWideChar(CP_ACP, 0, src,alen,NULL, 0 )+1; *dest = new WCHAR[ulen]; ::MultiByteToWideChar(CP_ACP, 0, src, alen, *dest, ulen); #else //多字節TCHAR就是 char int len = strlen(src)+1; *dest = new char[len]; strcpy(*dest, src); #endif }
二、TCHAR轉化爲多字節,一樣要注意*dest指針釋放編碼
void T2C(char** dest, const TCHAR* src) { if(src == NULL) return ; #ifdef _UNICODE size_t len = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0 , NULL, NULL); if (len == 0) { return; } *dest = new char[len]; WideCharToMultiByte( CP_ACP, 0, src, -1, *dest, len, NULL, NULL ); #else int len = _tcslen(src) + 1; *dest = new TCHAR[len]; strcpy(*dest, src); #endif }
三、下面兩個函數跟上面的有點重複可是後面會用到,也貼出來spa
//多字節轉化爲寬字節 void C2W(WCHAR** dest, const char* src) { if (src == NULL) { return ; } size_t alen = strlen(src) + 1; size_t ulen = (size_t)MultiByteToWideChar(CP_ACP, 0, src,alen,NULL, 0 )+1; *dest = new WCHAR[ulen]; ::MultiByteToWideChar(CP_ACP, 0, src, alen, *dest, ulen); } //寬字節轉化爲多字節 void W2C(char** dest, const WCHAR *src) { if(src == NULL) return ; size_t len = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0 , NULL, NULL); if (len == 0) { return; } *dest = new char[len]; WideCharToMultiByte( CP_ACP, 0, src, -1, *dest, len, NULL, NULL ); }
四、UTF-8和多字節及寬字節之間的轉化指針
//UNICODE能夠直接轉化爲UTF-8 void UnicodeToUtf8(char** dest , const WCHAR* src) { ASSERT(dest!= NULL || src != NULL); int len = -1; len = WideCharToMultiByte(CP_UTF8, 0, src, -1, 0, 0, 0, 0)+1; *dest = new char[len+1]; ::WideCharToMultiByte(CP_UTF8, 0, src, -1,*dest, len, 0, 0); } //多字節要先轉化爲寬字節在轉化爲UTF-8 void AnsiToUtf8(char** dest, const char* src) { ASSERT(dest!= NULL || src != NULL); WCHAR* pwszStr = NULL; C2W(&pwszStr, src); UnicodeToUtf8(dest, pwszStr); SAFE_ARRYDELETE(pwszStr); }
UTF-8轉化爲多字節或者UNICODE:code
void Utf8ToAnsi(char** dest, const char* src) { ASSERT(dest!= NULL || src != NULL); WCHAR* str = NULL; Utf8ToUnicode(&str, src); W2C(dest, str); SAFE_ARRYDELETE(str); } void Utf8ToUnicode(WCHAR** dest,const char* src) { ASSERT(dest!= NULL || src != NULL); int unicodeLen = ::MultiByteToWideChar( CP_UTF8, 0, src, -1, NULL, 0 ) + 1; *dest = new WCHAR[unicodeLen]; //memset(*dest, 0x0, (unicodeLen + 1)*sizeof(WCHAR)); MultiByteToWideChar(CP_UTF8, 0, src, -1, *dest, unicodeLen); }
SAFE_ARRYDELETE是一個內存是釋放宏以下blog
#define SAFE_ARRYDELETE(x) if(NULL!=x){delete[] x;x = NULL;} #define SAFE_DELETE(x) if(NULL!=x){delete x; x =NULL;}
有了以上函數基本上不一樣編碼間能夠隨意轉,你們也還能夠對以上這些函數盡心擴展,須要注意的是上面這些函數中dest指向的指針須要釋放。內存