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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

barbyQAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值