WideCharToMultiByte()中的第一个参数:代码页用CP_OEMCP
解决方案 »
- 有没有谁能够帮我弄弄MFC?最近要交了!!90%都做好了!!还有一点小问题,请联系我,QQ:381853390,我直接把工程文件发给你!!跪谢!!!!
- ACE 里JAWS 的问题 !!
- 各位,站一站,看看是否是CFile问题?
- 关于读取独占文件的问题
- 关于CPropertySheet的标签使用
- 求救:程序中引用了CComQIPtrIWebBrowser2,在IE关闭时,程序崩溃!
- 请大家看一下,这是Word的Bug吗?
- [求助]远程线程的问题
- 哪儿能找到关于vc与vc.net的比较研究资料?(加分)
- 大家快来交换软件开发资源,收藏夹、源代码、开发资料什么都行!!
- 想在Visual C++ 里编写C程序,该怎么办?
- 如何将基于对话框的程序做成托盘程序?
CP_ACP是当前激活的代码页。他们都可能是GB,也可能都不是GB,因此,正解是:用936!
这句有问题吧,
对于UNICODE字符,汉字的范围为0x4e00~0x9fa5
你判断范围的时候错误的使用了GB的范围,
只有GB2312编码标准的汉字范围才是高字节>0xff。建议:如果你知道源文本统一采用了UNICODE编码,即都是双字节编码,
循环采用函数WideCharToMultiByte就可以了,不需要判断范围。
你的观点是错误的,在UNICODE中,英文字符(包括控制字符)
以及汉字都是双字节编码。不会存在英文字符就单字节,而汉字
就双字节的情况。但在GB码中,单字节和双字节编码是共存的。
的机器当前激活的不是936(GB),那就错了!另外,CP_OEMCP是OEM出厂设定
的代码页,也不能用。
我以前也是你这么想的,在含有英文与汉字的字符串中在一起转换英文字符就不能正常显示出来,但如果是全中文就没有问题。那位朋友帮我改一改程序。
{
char buf1[200], buf2[200];
int i, len;
memset(buf1, 0, 200);
memset(buf2, 0, 200); for (i=0; i<pLen; i++) buf1[i] = pStr[i]; if (pLen > 0)
{
// convert the byte order
for (i=0; i<pLen - 1; i+= 2)
{
buf2[i] = buf1[i+1];
buf2[i+1] = buf1[i];
}
// count the actual lenth of string
len = WideCharToMultiByte(CP_ACP, 0L, (unsigned short *)&buf2[0], -1, pStr, 0, NULL, NULL);
// convert Unicode to ANSI
WideCharToMultiByte(CP_ACP, 0L, (unsigned short *)&buf2[0], -1, pStr, len, NULL, NULL);
}
}
这个函数能把汉字转换正确,但必须全部是汉字字串,如果是英文或才能英文与中文混和就有问题了。
其实你想一想,如果英文字符采用单字节,而汉字采用UNICODE编码,如果代码系列为0x69554a,那么你怎么判断哪个是英文字符哪个是汉字呢?在UNICODE中,英文字符及控制字符(对应于GB中0x00-0x7f)都需要一个前导0x00字节,凑成双字节。
我知道你的意思,帮我改一下程序吧。
{
// every unicode character needs two bytes
// assume that pLen is the length in bytes
int nLenUnicode = pLen / 2; ::WideCharToMultiByte(
CP_ACP, NULL, (unsigned short*)pStrSrc,
nLenUnicode,
pStrDest,
pLen, // 一般不需要pLen大小,因为英文字符转换以后只需要一个字节
// pStrDest存放转换以后的编码,在调用函数之前需要先申请
// 缓冲区
NULL, NULL);
}
然后分配内存。
然后再调用一次进行转换。两位为什么不仔细看看MSDN中WideCharToMultiByte的用法呢?