一、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;
}