幾個多字節和UNICODE及UTF-8之間相互轉化的函數(轉)

https://blog.csdn.net/mao0514/article/details/85986411

 

做vc++開發免不了多字節UNICODE、UTF-8轉來轉去,下面貼出我寫的幾個字符轉化函數

 1、 TCHAR  和CHAR轉化, TCHAR 對應UNICODE和多字節下分別是WCHAR 和CHAR 函數如下:

  需要注意*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
}

2、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
}

3、下面兩個函數跟上面的有點重複但是後面會用到,也貼出來

//多字節轉化爲寬字節
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 );

}

4、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);
 }

5 UTF-8轉化爲多字節或者UNICODE:

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是一個內存是釋放宏如下

#define SAFE_ARRYDELETE(x) if(NULL!=x){delete[] x;x = NULL;}

#define SAFE_DELETE(x) if(NULL!=x){delete x; x =NULL;}
 

有了以上函數基本上不同編碼間可以隨意轉,大家也還可以對以上這些函數盡心擴展,需要注意的是上面這些函數中dest指向的指針需要釋放。
 

發佈了14 篇原創文章 · 獲贊 14 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章