WideCharToMultiByte()中的第一个参数:代码页用CP_OEMCP

解决方案 »

  1.   

    有空!不能直接转吗?WideCharToMultiByte可以一次转任意长的字符串,用得着一个一个汉字搞吗?
      

  2.   

    CP_OEMCP是OEM安装操作系统设定的代码页
    CP_ACP是当前激活的代码页。他们都可能是GB,也可能都不是GB,因此,正解是:用936!
      

  3.   

    if (pStr[i]>128)   //判断此字符是否是汉字,是转换,否则就不
    这句有问题吧,
    对于UNICODE字符,汉字的范围为0x4e00~0x9fa5
    你判断范围的时候错误的使用了GB的范围,
    只有GB2312编码标准的汉字范围才是高字节>0xff。建议:如果你知道源文本统一采用了UNICODE编码,即都是双字节编码,
    循环采用函数WideCharToMultiByte就可以了,不需要判断范围。
      

  4.   

    TO zjpfly(flysnow):
    你的观点是错误的,在UNICODE中,英文字符(包括控制字符)
    以及汉字都是双字节编码。不会存在英文字符就单字节,而汉字
    就双字节的情况。但在GB码中,单字节和双字节编码是共存的。
      

  5.   

    另外,CP_ACP改成936,因为CP_ACP是当前激活的代码页的意思,如果运行
    的机器当前激活的不是936(GB),那就错了!另外,CP_OEMCP是OEM出厂设定
    的代码页,也不能用。
      

  6.   

    TO  vcadorer(云中客) 
          我以前也是你这么想的,在含有英文与汉字的字符串中在一起转换英文字符就不能正常显示出来,但如果是全中文就没有问题。那位朋友帮我改一改程序。
      

  7.   

    void UCS2GB(char* pStr, short pLen)
    {
    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);
    }
    }
    这个函数能把汉字转换正确,但必须全部是汉字字串,如果是英文或才能英文与中文混和就有问题了。
      

  8.   

    TO  zjpfly(flysnow):
    其实你想一想,如果英文字符采用单字节,而汉字采用UNICODE编码,如果代码系列为0x69554a,那么你怎么判断哪个是英文字符哪个是汉字呢?在UNICODE中,英文字符及控制字符(对应于GB中0x00-0x7f)都需要一个前导0x00字节,凑成双字节。
      

  9.   

    两位,用WideCharToMultiByte,肯定可以转混合字符的。
      

  10.   

    vcadorer(云中客) 
       我知道你的意思,帮我改一下程序吧。
      

  11.   

    void UCS2GB(char* pStrDest, char* pStrSrc, short pLen)
    {
    // 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);
    }
      

  12.   

    int nLenUnicode = pLen / 2; 不好,可以用WideCharToMultiByte获得转换后的长度。所以调用两次,第一次获得长度,
    然后分配内存。
    然后再调用一次进行转换。两位为什么不仔细看看MSDN中WideCharToMultiByte的用法呢?