我的程序从串口得到的数据是Unicode编码的,怎样把它转换成GB2312编码?

解决方案 »

  1.   

    调用WideChartoMultiByte函数,参考
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_2bj9.asp
      

  2.   

    char sz[512];
    WideCharToMultiByte( CP_ACP, 0, wszBuffer, -1, sz, 512, NULL, NULL );当你的WINDOWS为简体中文时,用CP_ACP,转换出来就是GBK. 
    如果不是简体中文,把CP_ACP用数字936替换,转换出来就是GBK.
      

  3.   

    将Unicode转换到ANSI
    (1)使用WideCharToMultiByte,例如:
    // 假设已经有了一个Unicode 串 wszSomeString... 
    char szANSIString [MAX_PATH]; 
    WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL ); 
    (2)使用W2A宏来实现,例如:
    USES_CONVERSION;
    pTemp=W2A(wszSomeString); 注意在转换时可能存在的问题:
    因为ANSI转UNICODE,如果使用A2W或MultiByteToWideChar(第一个参数是CP_ACP)的话,是根据系统默认的转码表,把转入的ANSI字符串看作Multi-Bytes字符串处理的,如果是中文(中文windows默认就是中文),一个大于0x87的byte可能和下一byte一起被看作一个汉字,然后根据汉字的Unicode编码转换为相同的Unicode汉字,如果找不到相应的编码,一般就用一个默认的字符来取代它(一般是问号“?”),由此看,如果随便把一段数据给他转,转化很复杂而且极可能不可逆,而且你加密过的ANSI码是相当混乱的有很多〉0x87的byte,转换就变得不可逆了。
    建议自己直接就这样写:
    CHAR lpANSI[COUNT];
    WCHAR lpUnicode[COUNT];
    int i = 0; 
    while(lpANSI[i] != '\0' ) {
        lpUnicode[i] = (WCHAR)lpANSI[i];
    }
    lpUnicode[i] = L'\0';
    然后按相同的方法转回来,因为对于0~0x87的ANSI字符串,对应的Unicode码就是相同的16位值,至于其他的,你的字符串反正加了密,没必要转换成显示出来是一样的字符,就按同样的方法处理了,其实如果中间的字符串不用显示或别的,直接reutrn (LPWSTR)lpANSI;过去也可以, 反正接受的时候自己清楚就可以了。