1. 程式人生 > >C++ ANSI 與 utf-8轉換

C++ ANSI 與 utf-8轉換

[cpp] view plain copy print?
  1. //UTF8轉ANSI
  2. void UTF8toANSI(CString &strUTF8)  
  3. {  
  4.     //獲取轉換為多位元組後需要的緩衝區大小,建立多位元組緩衝區
  5.     UINT nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,NULL,NULL);  
  6.     WCHAR *wszBuffer = newWCHAR[nLen+1];  
  7.     nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,wszBuffer,nLen);  
  8.     wszBuffer[nLen] = 0;  
  9.     nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);  
  10.     CHAR *szBuffer = newCHAR[nLen+1];  
  11.     nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);  
  12.     szBuffer[nLen] = 0;  
  13.     strUTF8 = szBuffer;  
  14.     //清理記憶體
  15.     delete []szBuffer;  
  16.     delete []wszBuffer;  
  17. }  
//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;
}
[cpp] view plain copy print?
  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 = newWCHAR[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 = newCHAR[nLen+1];  
  12.     nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);  
  13.     szBuffer[nLen] = 0;  
  14.     strAnsi = szBuffer;  
  15.     //記憶體清理
  16.     delete []wszBuffer;  
  17.     delete []szBuffer;  
  18. }  
//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;

}