程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Windows中兩種多字符與寬字符的轉換方法

Windows中兩種多字符與寬字符的轉換方法

編輯:關於C語言

在Windows中經常需要用到多字符與寬字符的轉換方法,所以多字符MultiChar)也就是ANSI編碼的方式,而寬字符WideChar)也就是Unicode編碼的方式。


首先是兩種傳統的轉換方法,分別是MutiByteToWideChar和WideCharToMutiByte。


int MultiByteToWideChar(

  UINT CodePage,

  DWORD dwFlags,

  LPCSTR lpMultiByteStr,

  int cchMultiByte,

  LPWSTR lpWideCharStr,

  int cchWideChar

  );


這是多字符轉換為寬字符的方法,6個參數的含義為:CodePage多字符所對應的的字符集,一般是CP_ACP), dwFlags(一些標准位,一般不需要使用,置0即可),lpMultiByteStr多字符的地址),cchMultiBytes多字符的字符串長度,相當於字符串的字節數,如果是1,則由函數判斷長度), lpWideCharStr寬字符的地址),cchWideChar寬字符的字符長度,相當於字符串的個數)。上面的兩個長度都是包含‘\n’的長度。

如果lpWideCharStr不為NULL,返回轉換成功的長度;如果lpWideCharStr為NULL,返回lpMultiByteStr的字符個數不是字符串長度!!!)。


常用的用法為:


//先將lpWideCharStr置成NULL,從而得到szText的長度。
int iBuffSize = ::MultiByteToWideChar(CP_ACP, 0, szText, -1, NULL, 0);
//判斷字符長度是否大於0
if (iBuffSize > 0)
{
    LPWSTR wszString = new wchar_t[iBuffSize+1];
    int nChars = ::MultiByteToWideChar(CP_ACP, 0, szText, -1,     wszString, iBuffSize);
    //這是擔心轉換失敗,從而nChars為0,再講wszString置成空字符串
    nChars = nChars < iBuffSize ? nChars:iBuffSize;
    wszString[nChars] = 0;
}


另一個是寬字符到多字符:

int WideCharToMultiByte(

  UINT CodePage,  DWORD dwFlags,  LPCWSTR lpWideCharStr,  int cchWideChar,  LPSTR lpMultiByteStr,  int cchMultiByte,  LPCSTR lpDefaultChar,  LPBOOL pfUsedDefaultChar  );


這裡比MultiByteToWideChar多兩個參數,而前面的六個參數都是一樣的,lpDefaultChar的作用是當函數遇到一個不能轉換的寬字符時,會用lpDefaultChar來代替,如果lpDefaultChar為NULL時,則用?代替。pfUsedDefaultChar的作用是如果有一個字符沒有成功轉換,則pfUsedDefaultChar為TRUE,否則為FALSE。

int iBuffSize = ::WideCharToMultiByte(CodePage, 0, szString, -1, NULL, 0, NULL, false);
if (iBuffSize > 0 )
{
    m_pString = new char[iBuffSize];
    ::WideCharToMultiByte(CodePage, 0, szString, -1, m_pString, iBuffSize, NULL, false);
}



另兩種轉換的方法是A2W和W2A,分別表示多字符到寬字符,寬字符到多字符。這兩個函數式atl的函數,所以需要加上頭文件<atlconv.h>


USES_CONVERSION;
wchar_t wszText[]=L"1.Unicode字符轉換為ANSI;";
char szText[]="2.ANSI字符轉換成Unicode.";
printf("%s\n",W2A(wszText));
wprintf(L"%s\n",A2W(szText));


注意的是每做一個轉換前,一定要加上USES_CONVERSION。


不過要注意是不要在大循環或者非常長的函數中使用W2A或者A2W,因為有內存溢出的問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved