4. 在ANSI和Unicode字符串之间进行翻译
如果你的Windows CE应用程序接口于台式PC,也许你必须操作PC机中的ANSI字符串数 据(例如,char字符串)。即使你在程序中只用到Unicode字符串,这都是事实。
你不能在Windows CE上处理一个ANSI字符串,因为没有操纵它们的库函数。最好的解 决办法是将ANSI字符串转换成Unicode字符串用到H/PC上,然后再将Unicode字符串转换回 ANSI字符串用到PC上。为了完成这些转换,可采用MultiByteToWideChar()和WideCharToM ultiByte () Win32 API 函数。 5. 对于Windows CE 1.0的字符串转换,劈开(hack)
在Windows CE 1.0 版本中,这些Win32API函数还没有完成。所以如果你想既要支持C E 1.0又能支持CE 2.0,就必须采用其它函数。将ANSI字符串转换成Unicode字符串可以用 wsprintf(),其中第一个参数采用一widechar字符串,并且认识"%S"(大写),意思是一个 字符串。由于没有wsscanf() 和 wsprintfA(),你必须想别的办法将Unicode字符串转换回 ANSI字符串。由于Windows CE 1.0不在国家语言支持(NLS)中,你也许得求助于hack,如下 所示:
/* Definition / prototypes of conversion functions Multi-Byte (ANSI) to WideChar (Unicode)
atow() converts from ANSI to widechar wtoa() converts from widechar to ANSI */ #if ( _WIN32_WCE >= 101)
#define atow(strA, strW, lenW) \ MultiByteToWidechar (CP_ACP, 0, strA, -1, strW, lenW)
#define wtoa(strW, strA, lenA) \ WideCharToMutiByte (CP_ACP, 0, strW, -1, strA, lenA, NULL, NULL)
#else /* _WIN32_WCE >= 101)*/
/* MultiByteToWideChar () and WideCharToMultiByte() not supported o-n Windows CE 1.0 */ int atow(char *strA, wchar_t *strW, int lenW); int wtoa(wchar_t *strW, char *strA, int lenA);
endif /* _WIN32_WCE >= 101*/
#if (_WIN32_WCE <101)
int atow(char *strA, wchar_t *strW, int lenW) { int len; char *pA; wchar_t *pW;
/* Start with len=1, not len=0, as string length returned must include null terminator, as in MultiByteToWideChar() */ for(pA=strA, pW=strW, len=1; lenW; pA++, pW++, lenW--, len++) { *pW = (lenW = =1) ? 0 : (wchar_t)( *pA); if( ! (*pW)) break; } return len; }
int wtoa(wxhar_t *strW, char *strA, int lenA) { int len; char *pA; wchar_t *pW; /* Start with len=1,not len=0, as string length returned Must include null terminator, as in WideCharToMultiByte() */ for(pA=strA, pW=strW, len=1; lenA; pa++, pW++, lenA--, len++) { pA = (len==1)? 0 : (char)(pW); if(!(*pA)) break; } return len; }
#endif /*_WIN32_WCE<101*/
这种适合于Windows CE 1.0的实现办法比使用wsprintf()函数要容易,因为使用wspr intf()函数更难以限制目标指针所指向的字符串的长度。
[此贴子已经被作者于2005-11-28 15:19:16编辑过] |