char *转换为WCHAR[]

本文介绍了ANSI与Unicode编码之间的转换方法,包括使用L宏、MultiByteToWideChar及WideCharToMultiByte函数等技术手段,并讨论了转换过程中可能遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q   如何实现ANSI和UNICODE的相互转换
A
将ANSI转换到Unicode
(1)通过L这个宏来实现,例如:   CLSIDFromProgID(   L "MAPI.Folder ",&clsid);
(2)通过MultiByteToWideChar函数实现转换,例如:
char   *szProgID   =   "MAPI.Folder ";
WCHAR   szWideProgID[128];
CLSID   clsid;
long lLen=MultiByteToWideChar(CP_ACP,0,szProgID,
strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen]   =   '\0 ';   


(3)通过A2W宏来实现,例如:  
USES_CONVERSION;  
CLSIDFromProgID(   A2W(szProgID),&clsid);   



将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;过去也可以,   反正接受的时候自己清楚就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值