自学内容网 自学内容网

Unicode与ANSI字符串的转换(MultiByteToWideChar与WideCharToMultiByte)

一、MultiByteToWideChar

int MultiByteToWideChar(
UINT uCodePage,
DWORD dwFlags,
PCSTR pMultiByteStr,
int cbMultiByte,
PWSTR pWideCharStr,
int cchWideChar
);
  1. uCodePage标识了与多字节字符串关联的一个代码页值。
  2. dwFlags标允许进行额外的控制,一般都使用0。
  3. pMultiByteStr指定要转换的字符串。
  4. cbMultiByte指定字符串的长度(字节数)。
    • 如果给cbMultiByte的值是-1,函数便可自动判断源字符串的长度。
  5. pWideCharStr指定了输出缓冲区。
    • 只有当缓冲区能够容纳该数量的宽字符时,转换才会成功。
    • 如果cchWideChar为0,函数就不会执行转换,而是返回一个宽字符数(包括\0)。
  6. cchWideChar指定了输出缓冲区的最大长度。

二、WideCharToMultiByte

int WideCharToMultiByte(
UINT ucodePage,
DWORD dwFlags,
PCWSTR pWideCharStr,
int cchWideChar,
PSTR pMultiByteStr,
int cbMultiByte,
PCSTR pDefaultChar,
PBOOL pfUsedDefaultChar
);
  1. uCodePage表示了要与新转换的字符串关联的代码页。
  2. dwFlags允许指定额外控制,一般为0。
  3. pWideCharStr指定要转换的字符串的内存地址。
  4. cchWideChar指定该字符串的长度(字符数)
  5. pMultiByteStr指定输出缓冲区。
  6. cbMultiByte指定了输出缓冲区大小(字节数)。
    • 传入0,会导致函数返回目标缓冲区需要的大小。
  7. pDefaultChar指定了无法表示的默认字符。
    • 如果为NULL(很常见),默认字符通常是一个问号,这对文件名来说很危险,因为?是通配符。
  8. pfUsedDefaultChar标识返回结果。如果有字符都成功转换,就是TRUE,否则就是FALSE
    • 可用于验证是否成功转换,通常传入NULL。

三、实例

#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;
}

原文地址:https://blog.csdn.net/qq_51470638/article/details/142499021

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!