看流星社区

 找回密码
 注册账号
查看: 1697|回复: 0

有关UNICODE、ANSI字符集和相关字符串操作的总结!

[复制链接]

该用户从未签到

发表于 2014-6-15 09:40:27 | 显示全部楼层 |阅读模式
Q   UNICODE字符串如何显示  

A  

如果程序定义了_UNICODE宏直接用  

WCHAR  *str=L"unicodestring";  

TextOut(0,0,str);  

否则就需要转换类型  

#include  <comdef.h>  

WCHAR  *str=L"unicodestring";  

bstr_t  str1=str;  

TextOut(0,0,(char*)str1);  



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];  

}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-29 07:31

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表