VC中Unicode编码的字符怎样转换成GB2312编码? 我的程序从串口得到的数据是Unicode编码的,怎样把它转换成GB2312编码? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 调用WideChartoMultiByte函数,参考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_2bj9.asp char sz[512];WideCharToMultiByte( CP_ACP, 0, wszBuffer, -1, sz, 512, NULL, NULL );当你的WINDOWS为简体中文时,用CP_ACP,转换出来就是GBK. 如果不是简体中文,把CP_ACP用数字936替换,转换出来就是GBK. 将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;过去也可以, 反正接受的时候自己清楚就可以了。 MFC怎么实现待机和休眠功能? MFC中文的保存 mfc问题! 哪位能提供全国电子地图(用于GIS开发)下载的网址?感激不尽 到底怎么才能让我的程序使用我自己导入的图标??! 如何直接改变非exe文件的图标? 如何用Delphi做一个ActiveX? 关于Combo 控件的响映事件!谢谢! 在ATL中有没有好用的字符串类? 我很菜,有个问题看看你比不比我更菜! xml path 100分求UTF8如何转成GB2312原码!
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_2bj9.asp
WideCharToMultiByte( CP_ACP, 0, wszBuffer, -1, sz, 512, NULL, NULL );当你的WINDOWS为简体中文时,用CP_ACP,转换出来就是GBK.
如果不是简体中文,把CP_ACP用数字936替换,转换出来就是GBK.
(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;过去也可以, 反正接受的时候自己清楚就可以了。