Unicode 和多字节字符集 (MBCS) 支持
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Unicode 和多字节字符集 (MBCS) 支持
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                
                            
                            
                            http://www.cnblogs.com/ccjt/p/4320244.html
 
unicode和多字節(jié)字符集是兩種不同的編碼方式,不同的編碼方式下,所對(duì)應(yīng)的一些函數(shù)是不兼容的。 讀到多字節(jié)菜單字符串之后,用MultiByteToWideChar()轉(zhuǎn)為unicode字符串
或者?使用API的A版本來設(shè)置菜單的顯示名稱,比如,SetMenuItemInfoA(...) 如果你新的庫(kù)是Unicode的,就用Unicode開發(fā),摒棄多字節(jié)編碼,多字節(jié)編碼弊端太多了。 其實(shí)改起來很簡(jiǎn)單,你把所有的char都改成TCHAR,如果能用CString,盡量用CString。所有字符串函數(shù)都換上帶_t的版本,比如_tsprintf()、_tcscpy之類的……因?yàn)檫@些東西都是同時(shí)兼容Unicode和ANSI的,所以改起來很容易。 你只要對(duì)于那些少數(shù)的多字節(jié)dll函數(shù),參數(shù)傳送字符串時(shí)實(shí)現(xiàn)用WideCharToMultiByte轉(zhuǎn)換一下。 我們?cè)谧铋_始學(xué)習(xí)MFC的時(shí)候,毫無疑問會(huì)遇到這樣的問題。 VC6的設(shè)置:多字節(jié)。 vs的默認(rèn)設(shè)置:Unicode,在屬性中可以改成多字節(jié)。 多字節(jié)編碼:char,string,CStringA。 Unicode編碼:wchar_t,wstring,CStringW。 注意:如果項(xiàng)目是Unicode,那么CString就被定義為CStringW,否則就是CStringA。 附: LPSTR = char*;LPCSTR = const char*; LPWSTR = wchar_t*;LPCWSTR = const wchar_t*; 至于LPCTSTR也是根據(jù)項(xiàng)目字符集來定義為L(zhǎng)PCWSTR(Unicode)或LPCSTR(多字節(jié))。 OK,上面的定義很明顯了,注意用的時(shí)候別弄混了,我覺得最好的方式是,使用wchar_t和wstring(api大多使用unicode,即使是多字節(jié)版本也是把多字節(jié)轉(zhuǎn)成unicode再去調(diào)用unicode版api),我不太喜歡CString。 接下來就是轉(zhuǎn)換:www.2cto.com // C++ char* 到 string:string str("char"); 或者string str = "char"; string 到 char*:const char* ch = str.c_str(); wchar_t* 和 wstring與上相同。 // MFC char* 到 CStringA:CStringA str("char"); CStringA 到 char*:const char* ch = str.operator LPCSTR(); (注意:反對(duì)使用GetBuffer,因?yàn)槭褂眠@個(gè),必須要ReleaseBuffer,而且很多時(shí)候沒必要去分配空間) wchar_t* 和 CStringW與上相同。 // 字符集之間轉(zhuǎn)換 char* 到 wchar_t*:CA2W a2w("char"); ?const wchar_t* wch = a2w.operator LPCWSTR(); wchar_t* 到 char*:CW2A w2a(L"wchar_t"); const char* ch = w2a.operator LPCSTR(); ?(注意:反對(duì)使用_T("chs")這種方式,程序字符集在一開始就該確定,而且最好選擇Unicode) 關(guān)于CA2W和CW2A這兩個(gè)類,可以在atlconv.h中找到源代碼,其實(shí)就是對(duì)WideCharToMultiByte和MultiByteToWideChar的封裝。 http://bbs.esrichina-bj.cn/ESRI/thread-97480-1-1.html
------解決方案--------------------
讀到多字節(jié)菜單字符串之后,用MultiByteToWideChar()轉(zhuǎn)為unicode字符串
或者 使用API的A版本來設(shè)置菜單的顯示名稱,比如,SetMenuItemInfoA(...)
------解決方案-------------------- 如果你新的庫(kù)是Unicode的,就用Unicode開發(fā),摒棄多字節(jié)編碼,多字節(jié)編碼弊端太多了。 其實(shí)改起來很簡(jiǎn)單,你把所有的char都改成TCHAR,如果能用CString,盡量用CString。所有字符串函數(shù)都換上帶_t的版本,比如_tsprintf()、_tcscpy之類的……因?yàn)檫@些東西都是同時(shí)兼容Unicode和ANSI的,所以改起來很容易。 char *str=(LPSTR)(LPCTSTR)strText; //CString轉(zhuǎn)為Char* char * ch_a =(char*)str.GetBuffer(str.GetLength()); 參考文獻(xiàn): https://msdn.microsoft.com/zh-cn/library/cc468203(v=VS.71).aspx https://msdn.microsoft.com/zh-cn/library/cz0a83sb ccjt.taobao.com
                        
                        
                        unicode和多字節(jié)字符集是兩種不同的編碼方式,不同的編碼方式下,所對(duì)應(yīng)的一些函數(shù)是不兼容的。 讀到多字節(jié)菜單字符串之后,用MultiByteToWideChar()轉(zhuǎn)為unicode字符串
或者?使用API的A版本來設(shè)置菜單的顯示名稱,比如,SetMenuItemInfoA(...) 如果你新的庫(kù)是Unicode的,就用Unicode開發(fā),摒棄多字節(jié)編碼,多字節(jié)編碼弊端太多了。 其實(shí)改起來很簡(jiǎn)單,你把所有的char都改成TCHAR,如果能用CString,盡量用CString。所有字符串函數(shù)都換上帶_t的版本,比如_tsprintf()、_tcscpy之類的……因?yàn)檫@些東西都是同時(shí)兼容Unicode和ANSI的,所以改起來很容易。 你只要對(duì)于那些少數(shù)的多字節(jié)dll函數(shù),參數(shù)傳送字符串時(shí)實(shí)現(xiàn)用WideCharToMultiByte轉(zhuǎn)換一下。 我們?cè)谧铋_始學(xué)習(xí)MFC的時(shí)候,毫無疑問會(huì)遇到這樣的問題。 VC6的設(shè)置:多字節(jié)。 vs的默認(rèn)設(shè)置:Unicode,在屬性中可以改成多字節(jié)。 多字節(jié)編碼:char,string,CStringA。 Unicode編碼:wchar_t,wstring,CStringW。 注意:如果項(xiàng)目是Unicode,那么CString就被定義為CStringW,否則就是CStringA。 附: LPSTR = char*;LPCSTR = const char*; LPWSTR = wchar_t*;LPCWSTR = const wchar_t*; 至于LPCTSTR也是根據(jù)項(xiàng)目字符集來定義為L(zhǎng)PCWSTR(Unicode)或LPCSTR(多字節(jié))。 OK,上面的定義很明顯了,注意用的時(shí)候別弄混了,我覺得最好的方式是,使用wchar_t和wstring(api大多使用unicode,即使是多字節(jié)版本也是把多字節(jié)轉(zhuǎn)成unicode再去調(diào)用unicode版api),我不太喜歡CString。 接下來就是轉(zhuǎn)換:www.2cto.com // C++ char* 到 string:string str("char"); 或者string str = "char"; string 到 char*:const char* ch = str.c_str(); wchar_t* 和 wstring與上相同。 // MFC char* 到 CStringA:CStringA str("char"); CStringA 到 char*:const char* ch = str.operator LPCSTR(); (注意:反對(duì)使用GetBuffer,因?yàn)槭褂眠@個(gè),必須要ReleaseBuffer,而且很多時(shí)候沒必要去分配空間) wchar_t* 和 CStringW與上相同。 // 字符集之間轉(zhuǎn)換 char* 到 wchar_t*:CA2W a2w("char"); ?const wchar_t* wch = a2w.operator LPCWSTR(); wchar_t* 到 char*:CW2A w2a(L"wchar_t"); const char* ch = w2a.operator LPCSTR(); ?(注意:反對(duì)使用_T("chs")這種方式,程序字符集在一開始就該確定,而且最好選擇Unicode) 關(guān)于CA2W和CW2A這兩個(gè)類,可以在atlconv.h中找到源代碼,其實(shí)就是對(duì)WideCharToMultiByte和MultiByteToWideChar的封裝。 http://bbs.esrichina-bj.cn/ESRI/thread-97480-1-1.html
------解決方案--------------------
讀到多字節(jié)菜單字符串之后,用MultiByteToWideChar()轉(zhuǎn)為unicode字符串
或者 使用API的A版本來設(shè)置菜單的顯示名稱,比如,SetMenuItemInfoA(...)
------解決方案-------------------- 如果你新的庫(kù)是Unicode的,就用Unicode開發(fā),摒棄多字節(jié)編碼,多字節(jié)編碼弊端太多了。 其實(shí)改起來很簡(jiǎn)單,你把所有的char都改成TCHAR,如果能用CString,盡量用CString。所有字符串函數(shù)都換上帶_t的版本,比如_tsprintf()、_tcscpy之類的……因?yàn)檫@些東西都是同時(shí)兼容Unicode和ANSI的,所以改起來很容易。 char *str=(LPSTR)(LPCTSTR)strText; //CString轉(zhuǎn)為Char* char * ch_a =(char*)str.GetBuffer(str.GetLength()); 參考文獻(xiàn): https://msdn.microsoft.com/zh-cn/library/cc468203(v=VS.71).aspx https://msdn.microsoft.com/zh-cn/library/cz0a83sb ccjt.taobao.com
總結(jié)
以上是生活随笔為你收集整理的Unicode 和多字节字符集 (MBCS) 支持的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 陈老师排课12A(6天上4下4)小学专用
- 下一篇: 中关村被骗,太平洋也好不到哪去 记一次太
