描述:
我用ATL编程,添加一个复合控件.可是输入文本框(EDIT,COMBOX)输入中文(不管是五笔还是拼音等中文输入)却成了乱码,可我用剪贴板,将我要输入的文本先粘贴进去,又是正确的.我同时也在其它电脑上试过,还是出现同样的问题.请问各位,这是什么原因??????????????
解决方案1:
你可以用WideCharToMultiByte()将一个Unicode串转换成一个ANSI串。此函数的原型如下:
int WideCharToMultiByte (
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar );
你可以用WideCharToMultiByte()将一个Unicode串转换成一个ANSI串。此函数的原型如下:
int WideCharToMultiByte (
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar );
以下是参数解释:
CodePage
Unicode字符转换成的代码页。你可以传递CP_ACP来使用当前的ANSI代码页。代码页是256个字符集。字符0——127与ANSI编码一样。字符128——255与ANSI字符不同,它可以包含图形字符或者读音符号。每一种语言或地区都有其自己的代码页,所以使用正确的代码页对于正确地显示重音字符很重要。
dwFlags
dwFlags 确定Windows如何处理“复合” Unicode字符,它是一种后面带读音符号的字符。如è就是一个复合字符。如果这些字符在CodePage参数指定的代码页中,不会出什么事。否则,Windows必须对之进行转换。
传递WC_COMPOSITECHECK使得这个API检查非映射复合字符。
传递WC_SEPCHARS使得Windows将字符分为两段,即字符加读音,如e`。
传递WC_DISCARDNS使得Windows丢弃读音符号。
传递WC_DEFAULTCHAR使得Windows用lpDefaultChar参数中说明的缺省字符替代复合字符。
缺省行为是WC_SEPCHARS。
lpWideCharStr
要转换的Unicode串。
cchWideChar
lpWideCharStr在Unicode 字符中的长度。通常传递-1,表示这个串是以0x00结尾。
lpMultiByteStr
接受转换的串的字符缓冲
cbMultiByte
lpMultiByteStr的字节大小。
lpDefaultChar
可选——当dwFlags包含WC_COMPOSITECHECK | WC_DEFAULTCHAR并且某个Unicode字符不能被映射到同等的ANSI串时所传递的一个单字符ANSI串,包含被插入的“缺省”字符。可以传递NULL,让API使用系统缺省字符(一种写法是一个问号)。
lpUsedDefaultChar
可选——指向BOOL类型的一个指针,设置它来表示是否缺省字符曾被插入ANSI串。可以传递NULL来忽略这个参数。
// 假设已经有了一个Unicode 串 wszSomeString...
char szANSIString [MAX_PATH];
WideCharToMultiByte ( CP_ACP, // ANSI 代码页
WC_COMPOSITECHECK, // 检查重音字符
wszSomeString, // 原Unicode 串
-1, // -1 意思是串以0x00结尾
szANSIString, // 目的char字符串
sizeof(szANSIString), // 缓冲大小
NULL, // 肥缺省字符串
NULL ); // 忽略这个参数
调用这个函数后,szANSIString将包含Unicode串的ANSI版本。
晕死了,我不过一段时间没来,就不会发帖了,我有问题要问,却找不到可以发表主题帖的按扭,只可以回复。
BLOG里明确限定只能发文章,不能提问题。教教我呀,如何发表主题帖。
CString strAddress=L("http://www.163.com");
解决方案5: 把
CString strAddress="http://www.163.com";
换成
CString strAddress=L"http://www.163.com";
试试
楼主你就不要用CString了,直接用BSTR或者就用_bstr_t就好了。
_bstr_t strAddress= _T("http://www.163.com");