Windows 下编程字符的处理
在对字符的编码中,习惯用一个字节表示一个字符,ASCII字符采用这样子的编码方式,因此最多只
能表示256中字符。
在编程中如果要对软件进行本地化,字符的表示就是一个需要解决的问题,对于象形文字的表示,
一个字节是远远不够的,因此就提出Unicode字符编码,用两个字节来对字符进行编码。因此,总共可以
得到65000个字符。对于Unicode编码的相关细则,请查阅相关资料。
Windows 2000:既支持Unicode也支持ASCII,但是有一点需要明确,它的内核只支持Unicode.
Windows 98:只支持ASCII。
Windows CE:只支持Unicode。
COM:COM中需要字符串的接口方法只能接受Unicode字符串(因为COM通常用于使不同的组件能够互
相进行通信,而Unicode则是传递字符串的最佳手段)。
在进行Windows编程时,为了能编写通用的程序代码,对字符串的处理,我们尽量使用操作系统以及
C运行库提供的转换宏。在C运行期库下,这组宏包含在TChar.h头文件中(如果要使用Unicode,需要定义
_UNICODE),而对于操作系统来说,如果需要使用nicode,需要定义UNICODE,而不仅仅是_UNICODE。所
以这里你需要定义这两个宏。
_T/_TEXT 根据是否定义了_UNICODE而决定是否采用Unicode.
L 转换为Unicode字符集。
下面是一个ASCII到Unicode的转换:
BOOL AnsiToUnicode(PSTR pAnsi,PWSTR *pUnicode)
{
// 确认被转换字符串指针不为空
if(NULL == pAnsi) return FALSE;
// 确认传入的接受字符串指针为NULL
if(NULL != *pUnicode) return FALSE;
// 取得被转换字符串长度
int iCharLen = MultiByteToWideChar(CP_ACP,0,pAnsi,-1,NULL,0);
*pUnicode = (PWSTR)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*iCharLen);
// 分配内存失败
if(NULL == *pUnicode) return FALSE;
MultiByteToWideChar(CP_ACP,0,pAnsi,-1,*pUnicode,iCharLen);
return TRUE;
}
Unicode到ASCII的转换:
BOOL UnicodeToAnsi(PWSTR pUnicode,PSTR *pAnsi)
{
// 确认被转换字符串指针不为空
if(NULL == pUnicode) return FALSE;
// 确认传入的接受字符串指针为NULL
if(NULL != *pAnsi) return FALSE;
// 取得被转换字符串长度
int iCharNum = WideCharToMultiByte(CP_OEMCP,0,pUnicode,-1,NULL,0,NULL,FALSE);
*pAnsi = (PSTR)HeapAlloc(GetProcessHeap(),0,sizeof(CHAR)*iCharNum);
// 分配内存失败
if(NULL == *pUnicode) return FALSE;
WideCharToMultiByte(CP_OEMCP,0,pUnicode,-1,*pAnsi,iCharNum,NULL,FALSE);
return TRUE;
}
使用完后记得调用HeapFree()释放分配的资源。