Unicode 和多字节字符集 (MBCS) 支持


unicode和多字节字符集是两种不同的编码方式,不同的编码方式下,所对应的一些函数是不兼容的。
读到多字节菜单字符串之后,用MultiByteToWideChar()转为unicode字符串

或者 使用API的A版本来设置菜单的显示名称,比如,SetMenuItemInfoA(...)
如果你新的库是Unicode的,就用Unicode开发,摒弃多字节编码,多字节编码弊端太多了。
其实改起来很简单,你把所有的char都改成TCHAR,如果能用CString,尽量用CString。所有字符串函数都换上带_t的版本,比如_tsprintf()、_tcscpy之类的……因为这些东西都是同时兼容Unicode和ANSI的,所以改起来很容易。
你只要对于那些少数的多字节dll函数,参数传送字符串时实现用WideCharToMultiByte转换一下。
 
 
我们在最开始学习MFC的时候,毫无疑问会遇到这样的问题。
VC6的设置:多字节。
vs的默认设置:Unicode,在属性中可以改成多字节。
多字节编码:char,string,CStringA。
Unicode编码:wchar_t,wstring,CStringW。
注意:如果项目是Unicode,那么CString就被定义为CStringW,否则就是CStringA。
附:
LPSTR = char*;LPCSTR = const char*;
LPWSTR = wchar_t*;LPCWSTR = const wchar_t*;
至于LPCTSTR也是根据项目字符集来定义为LPCWSTR(Unicode)或LPCSTR(多字节)。
OK,上面的定义很明显了,注意用的时候别弄混了,我觉得最好的方式是,使用wchar_t和wstring(api大多使用unicode,即使是多字节版本也是把多字节转成unicode再去调用unicode版api),我不太喜欢CString。
接下来就是转换: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(); (注意:反对使用GetBuffer,因为使用这个,必须要ReleaseBuffer,而且很多时候没必要去分配空间)
wchar_t* 和 CStringW与上相同。
// 字符集之间转换
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();  (注意:反对使用_T("chs")这种方式,程序字符集在一开始就该确定,而且最好选择Unicode)
关于CA2W和CW2A这两个类,可以在atlconv.h中找到源代码,其实就是对WideCharToMultiByte和MultiByteToWideChar的封装。
 
 
http://bbs.esrichina-bj.cn/ESRI/thread-97480-1-1.html

------解决方案--------------------

读到多字节菜单字符串之后,用MultiByteToWideChar()转为unicode字符串

或者 使用API的A版本来设置菜单的显示名称,比如,SetMenuItemInfoA(...)

------解决方案--------------------
如果你新的库是Unicode的,就用Unicode开发,摒弃多字节编码,多字节编码弊端太多了。
其实改起来很简单,你把所有的char都改成TCHAR,如果能用CString,尽量用CString。所有字符串函数都换上带_t的版本,比如_tsprintf()、_tcscpy之类的……因为这些东西都是同时兼容Unicode和ANSI的,所以改起来很容易。
 
char *str=(LPSTR)(LPCTSTR)strText; //CString转为Char*
 char * ch_a =(char*)str.GetBuffer(str.GetLength());
参考文献:
https://msdn.microsoft.com/zh-cn/library/cc468203(v=VS.71).aspx
https://msdn.microsoft.com/zh-cn/library/cz0a83sb
ccjt.taobao.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值