C++ ANSI 與 utf-8轉換




  1. //UTF8轉ANSI  
  2. void UTF8toANSI(CString &strUTF8)  
  3. {  
  4.     //獲取轉換爲多字節後需要的緩衝區大小,創建多字節緩衝區  
  5.     UINT nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,NULL,NULL);  
  6.     WCHAR *wszBuffer = new WCHAR[nLen+1];  
  7.     nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,wszBuffer,nLen);  
  8.     wszBuffer[nLen] = 0;  
  9.   
  10.     nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);  
  11.     CHAR *szBuffer = new CHAR[nLen+1];  
  12.     nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);  
  13.     szBuffer[nLen] = 0;  
  14.       
  15.     strUTF8 = szBuffer;  
  16.     //清理內存  
  17.     delete []szBuffer;  
  18.     delete []wszBuffer;  
  19. }  
//UTF8轉ANSI
void UTF8toANSI(CString &strUTF8)
{
    //獲取轉換爲多字節後需要的緩衝區大小,創建多字節緩衝區
    UINT nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,NULL,NULL);
    WCHAR *wszBuffer = new WCHAR[nLen+1];
    nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,wszBuffer,nLen);
    wszBuffer[nLen] = 0;

    nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);
    CHAR *szBuffer = new CHAR[nLen+1];
    nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);
    szBuffer[nLen] = 0;

    strUTF8 = szBuffer;
    //清理內存
    delete []szBuffer;
    delete []wszBuffer;
}
  1. //ANSI轉UTF8  
  2. void ANSItoUTF8(CString &strAnsi)  
  3. {  
  4.     //獲取轉換爲寬字節後需要的緩衝區大小,創建寬字節緩衝區,936爲簡體中文GB2312代碼頁  
  5.     UINT nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,NULL,NULL);  
  6.     WCHAR *wszBuffer = new WCHAR[nLen+1];  
  7.     nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,wszBuffer,nLen);  
  8.     wszBuffer[nLen] = 0;  
  9.     //獲取轉爲UTF8多字節後需要的緩衝區大小,創建多字節緩衝區  
  10.     nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);  
  11.     CHAR *szBuffer = new CHAR[nLen+1];  
  12.     nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);  
  13.     szBuffer[nLen] = 0;  
  14.       
  15.     strAnsi = szBuffer;  
  16.     //內存清理  
  17.     delete []wszBuffer;  
  18.     delete []szBuffer;  
  19. }  
//ANSI轉UTF8
void ANSItoUTF8(CString &strAnsi)
{
    //獲取轉換爲寬字節後需要的緩衝區大小,創建寬字節緩衝區,936爲簡體中文GB2312代碼頁
    UINT nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,NULL,NULL);
    WCHAR *wszBuffer = new WCHAR[nLen+1];
    nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,wszBuffer,nLen);
    wszBuffer[nLen] = 0;
    //獲取轉爲UTF8多字節後需要的緩衝區大小,創建多字節緩衝區
    nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);
    CHAR *szBuffer = new CHAR[nLen+1];
    nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);
    szBuffer[nLen] = 0;

    strAnsi = szBuffer;
    //內存清理
    delete []wszBuffer;
    delete []szBuffer;
}


自己改的c版本,測試可用:

static void UTF8toANSI(char *strUTF8,char*out_ansi)
{
//獲取轉換爲多字節後需要的緩衝區大小,創建多字節緩衝區
UINT nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, NULL, 0);
WCHAR wszBuffer = (WCHAR)malloc((nLen+1)*sizeof(WCHAR));
nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, wszBuffer, nLen);
wszBuffer[nLen] = 0;

nLen = WideCharToMultiByte(936, 0, wszBuffer, -1, NULL, 0, NULL, NULL);
nLen = WideCharToMultiByte(936, 0, wszBuffer, -1, out_ansi, nLen, NULL, NULL);
out_ansi[nLen] = 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章