您的位置:首页 > 其它

让你的程序更加适用——使用ANSI和UNICODE导出函数

2010-07-22 06:49 316 查看
继前两篇文章之后,我们更加关心的问题是,我们可能为了方便他人的使用,需要提供ANSI和UNICODE版本的函数,此时,我们可以模

仿
Windows的作法,我们只编写UNICODE版本的函数,然后在ANSI版本的函数中,我们把多字符转换成UNICODE字符串,然后调用UNICODE版


的函数,完成之后,再把他还原成多字符集的字符串。

此处,引用示例,逆转字符串中所有字符的函数:

]BOOL StringReverseW(PWSTR pWideCharStr, DWORD cchLength)
{
PWSTR pEndOfStr = pWideCharStr + wcsnlen_s(pWideCharStr, cchLength) - 1;
wchar_t cCharT;
while(pWideCharStr < pEndOfStr)
{
//保存到一个临时变量中
cCharT = *pWideCharStr;
//把最后一个字符放进第一个字符中
*pWideCharStr = *pEndOfStr;
//把临时变量放进最后一个字符中
*pEndOfStr = cCharT;
//想左移动一个字符位置
pWideCharStr++;
//向右移动一个字符位置
pEndOfStr--;
}
return TRUE;
}
BOOL StringReverseA(PSTR pMultiByteStr, DWORD cchLength)
{
PWSTR pWideCharStr;
int   nLenOfWideCharStr;
BOOL  fOk = FALSE;
//获取需要转换字符串的大小
nLenOfWideCharStr = MultiByteToWideChar(CP_ACP, 0,
pMultiByteStr, cchLength, NULL, 0);
//为字符串分配内存
pWideCharStr = (PWSTR)HeapAlloc(GetProcessHeap(), 0,
nLenOfWideCharStr * sizeof(wchar_t));
if (NULL == pWideCharStr)
{
return fOk;
}
//转换成宽字符pWideCharStr
MultiByteToWideChar(CP_ACP, 0, pMultiByteStr, cchLength,
pWideCharStr, nLenOfWideCharStr);
//使用宽字符函数进行处理
fOk = StringReverseW(pWideCharStr, cchLength);
if (fOk)
{
//转换为多字符
WideCharToMultiByte(CP_ACP, 0, pWideCharStr, cchLength,
pMultiByteStr, (int)strlen(pMultiByteStr), NULL, NULL);
}
//释放内存
HeapFree(GetProcessHeap(), 0, pWideCharStr);
return fOk;
}


然后,我们可以在发布的.h头文件中,这样定义函数:

]BOOL StringReverseW(PWSTR pWideCharStr, DWORD cchLength)
BOOL StringReverseA(PSTR pMultiByteStr, DWORD cchLength)
#ifdef UNICODE
#define StringReverse StringReverseW
#else
#define StringReverse StringReverseA
#endif


这样,使用我们函数的人,也就不用再为是否是UNICODE或是ANSI而焦头烂额了。

同系列文章参看:

《多字符集(ANSI)和UNICODE及字符串处理方式准则》


UNICODE和ANSI字符串的转换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐