字元編碼的問題
C/C++發展的過程很長,早期的字元都是Multibyte的形式,後期為了處理多國語言增加了Unicode,因此比JAVA和C#這些後來者內建的字元是Unicode的支援,在處理時需要注意。
I18n Internationalization:國際化的簡寫
l10n localization: 本地化的簡寫
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vccrt/html/ee536a04-3558-4729-8e10-6dabcde055fd.htm Internationalization
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vccrt/html/4e573c05-8800-468b-ae5f-76ff7409835e.htm Data Type Mappings
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vccrt/html/a03de0db-8118-4bd9-a03f-640e8dfc5ed3.htm A Sample Generic-Text Program
字元初始化
Genreic [和編譯類別有關,Unicode編譯時間是Unicode] |
_TCHAR buff[_MAX_PATH] = {TEXT("hello")}; TCHAR *s1 = _T("tchar with compile option"); TCHAR *s2 = _TEXT("tchar"); |
Unicode |
wchar_t *wmsg = L"Is"; WCHAR *uc = L"Is uc"; |
MBCS |
char *amsg = "Reversed"; |
字元轉換
Windows |
WideCharToMultiByte MultiByteToWideChar 當然MFC ATL和相關的庫有相關的轉換輔助函數,可在這些原始碼中找到 (如c:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlcomcli.h 中A2WBSTR) |
iconv |
GNU開源的組件,多種字元編碼的轉換 跨平台 |
例子
/*通過 CComBSTR(_In_opt_z_ LPCSTR pSrc) 建構函式
申請空間SysAllocStringLen
字元轉碼MultiByteToWideChar 放到動態空間m_str成員
改進方法:直接使用Unicode賦值,因此對於TCHAR WCHAR _T TEXT L 這些輔助的字元處理函數和宏要熟悉
text = L"demo";*/CComBSTR text = "demo";以下是從一個實際的軟體代碼中節選的錯誤使用方式
#include <string>using namespace std ; void Demo(BSTR bstrlibName){_bstr_t bstr_name(bstrlibName);string strName;strName = bstr_name;strName = strName.substr(1);//¡. CString next(strName.c_str());//Process¡//¡}
分析
以上代碼是不同人維護引入的,估計是由於不同人員熟悉和使用的庫不一樣,比如甲熟悉stl, 乙熟悉MFC,…,不過這樣的代碼匯在一起,
如果在要求效率的地方,那麼以上的代碼存在很大的效率隱患。
只要在VS中定位到STL MFC等這些類的代碼,就可以知道,這樣的對象在使用過程中進行n多的空間申請和賦值等。
可能的改進方法
Ø 如以上傳入是BSTR,因此一般情況下最好直接使用這個類型處理,不要引入不必要的對象轉換
Ø 也有可能某人想使用已有的對象提供的函數減少不必要的編碼,此時最好只引入一個類,或則STL,或則CString等
(此時選擇的類最好是和BSTR配套的如wstring,以減少轉換問題)
Ø 為了在項目中更通用,其實也可以封裝一個針對項目特殊處理的類以減少轉換和減少空間申請問題