如何同时提供ANSI和UNICODE函数
继前两篇文章之后,我们更加关心的问题是,我们可能为了方便他人的使用,需要提供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及字符串处理方式准则》
原文地址: