一、MultiByteToWideChar
int MultiByteToWideChar(
UINT uCodePage,
DWORD dwFlags,
PCSTR pMultiByteStr,
int cbMultiByte,
PWSTR pWideCharStr,
int cchWideChar
);
uCodePage
标识了与多字节字符串关联的一个代码页值。dwFlags
标允许进行额外的控制,一般都使用0。pMultiByteStr
指定要转换的字符串。cbMultiByte
指定字符串的长度(字节数)。
- 如果给
cbMultiByte
的值是-1,函数便可自动判断源字符串的长度。
pWideCharStr
指定了输出缓冲区。
- 只有当缓冲区能够容纳该数量的宽字符时,转换才会成功。
- 如果
cchWideChar
为0,函数就不会执行转换,而是返回一个宽字符数(包括\0
)。
cchWideChar
指定了输出缓冲区的最大长度。
二、WideCharToMultiByte
int WideCharToMultiByte(
UINT ucodePage,
DWORD dwFlags,
PCWSTR pWideCharStr,
int cchWideChar,
PSTR pMultiByteStr,
int cbMultiByte,
PCSTR pDefaultChar,
PBOOL pfUsedDefaultChar
);
uCodePage
表示了要与新转换的字符串关联的代码页。dwFlags
允许指定额外控制,一般为0。pWideCharStr
指定要转换的字符串的内存地址。cchWideChar
指定该字符串的长度(字符数)pMultiByteStr
指定输出缓冲区。cbMultiByte
指定了输出缓冲区大小(字节数)。
pDefaultChar
指定了无法表示的默认字符。
- 如果为NULL(很常见),默认字符通常是一个问号,这对文件名来说很危险,因为?是通配符。
pfUsedDefaultChar
标识返回结果。如果有字符都成功转换,就是TRUE
,否则就是FALSE
。
三、实例
#include <windows.h>
BOOL
StringReverseW (PWSTR pWideCharStr, DWORD cchLength)
{
PWSTR pEndOfStr = pWideCharStr + wcsnlen (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)
{
BOOL fOK = FALSE;
int nLenOfWideStr = MultiByteToWideChar (CP_ACP, 0, pMultiByteStr, cchLength, NULL, 0);
PWSTR pWideCharStr = (PWSTR)HeapAlloc (GetProcessHeap(), 0, nLenOfWideStr * sizeof (wchar_t));
if (!pWideCharStr)
return FALSE;
MultiByteToWideChar (CP_ACP, 0, pMultiByteStr, cchLength, pWideCharStr, nLenOfWideStr);
fOK = StringReverseW (pWideCharStr, nLenOfWideStr);
if (fOK) {
assert (cchLength == strlen (pMultiByteStr));
WideCharToMultiByte (CP_ACP, 0, pWideCharStr, nLenOfWideStr, pMultiByteStr, cchLength, NULL, NULL);
}
HeapFree (GetProcessHeap(), 0, pWideCharStr);
return fOK;
}