(1) ANSI -> Unicode
int
MultiByteToWideChar(
__in
UINT
CodePage,
// 标识了与多字节关联的一个代码页值
__in
DWORD
dwFlags,
// 允许我们进行额外的控制,它会影响带变音符号(比如重音)的字符。但是一般情况下不适用,赋为 0 即可。
__in
LPCSTR
lpMultiByteStr,
// 参数指定要转换的字符串
__in
int
cbMultiByte,
// 指定要转换串长度的长度(字节数),如果参数值是-1,函数便可自动判断源字符串的长度
__out
LPWSTR
lpWideCharStr,
// 指定转换后Unicode版本的字符串内存地址
__in
int
cchWideChar
// 指定 lpWideCharStr 缓冲区的最大长度。
// 如果传入0,函数不会进行转换,而是返回一个宽字符数(包括终止字符'\0'),
// 只有当缓冲区能够容纳该数量的宽字符时,转换才会成功。
);
|
转换步骤:
(1)调用 MultiByteToWideChar,为 pWideCharStr 参数传入 NULL, 为cchWideChar 参数传入 0,为 cbMultiByte 参数传入 -1 。
(2)分配一块足以容纳转换后的 Unicode 字符串的内容。它的大小是上一个 MultiByteToWideChar 调用的返回值乘以 sizeof(wchar_t) 。
(3)再次调用MultiByteToWideChar,这一次将缓冲区地址作为 pWideCharStr 参数的值传入,将第一次 MultiByteToWideChar 调用的返回值乘以 sizeof(wchar_t) 后得到大小作为 cchWideChar 参数的值传入。
(4)使用转换后的字符串
(5)释放 Unicode 字符串占用的内存块。
示例代码:
/*
* Subject: Convert ANSI to Unicode
* IDE: Visual Studio 2008
* Auther: http://www.cnblogs.com/chinazhangjie
* Mail: chinajiezhang@gmail.com
* Date:2011/10/10
*/
#include <stdio.h>
#include <windows.h>
int
main()
{
char
*pANSI =
"ANSI to Unicode, ANSI 转换到 Unicode"
;
wchar_t
*pUnicode = NULL;
int
nWideCharLen = 0;
// step.1
nWideCharLen = MultiByteToWideChar(CP_ACP, 0, pANSI, -1, NULL, 0);
printf
(
"nWideCharLen = %d\n"
, nWideCharLen);
// step.2
pUnicode = (
wchar_t
*)
malloc
(nWideCharLen *
sizeof
(
wchar_t
));
// step.3
MultiByteToWideChar(CP_ACP, 0, pANSI, -1, pUnicode, nWideCharLen *
sizeof
(
wchar_t
));
// step.4
MessageBoxW(NULL, pUnicode, TEXT(
"Unicode"
), 0);
// step.5
free
(pUnicode);
return
0;
}
|
(2) Unicode->ANSI
int
WideCharToMultiByte(
__in
UINT
CodePage,
// 标志了要与新转换的字符串关联的代码页
__in
DWORD
dwFlags,
// 制定额外的转换控制,一般不需要进行这种程度的控制,而为 dwFlag 传入 0
__in
LPCWSTR
lpWideCharStr,
// 指定要转换的字符串的内存地址
__in
int
cchWideChar,
// 指出该字符串的长度,如果传入 -1 ,则由函数来判断字符串的长度
__out
LPSTR
lpMultiByteStr,
// 转换后的缓冲区
__in
int
cbMultiByte,
// 指定 lpMultiByteStr 缓冲区的最大大小(字节数),如果传入 0 ,函数返回该目标缓冲区需要的大小
__in
LPCSTR
lpDefaultChar,
__out
LPBOOL
lpUsedDefaultChar
// 宽字符字符串中,如果至少有一个字符不能转换为对应的多字节形式,函数就会把这个变量设为 TRUE 。如果所有字符都能成功转换,就会把这个变量设为 FALSE。 通常将此函数传入 NULL 值。
);
|
只有一个字符在 uCodePage 制定的代码页中没有对应的表示时,WideCharToMultiByte 才会使用后两个参数。在遇到一个不能转换的字符时,函数便使用 pDefaultChar 参数指向的字符。如果这个参数指向为 NULL ,函数就会使用一个默认的字符。这个默认的值通常是一个问号。这对文件操作是非常危险的,因为问号是一个通配符。
转换步骤和 ANSI -> Unicode 相似,故不做赘述。
示例代码:
/*
* Subject: Convert Unicode to ANSI
* IDE: Visual Studio 2008
* Auther: http://www.cnblogs.com/chinazhangjie
* Mail: chinajiezhang@gmail.com
* Date:2011/10/10
*/
#include <stdio.h>
#include <windows.h>
int
main()
{
wchar_t
*pUnicode = TEXT(
"Convert Unicode to ANSI, Unicode 转换为 ANSI"
);
char
*pANSI = NULL;
int
nByte = 0;
// step.1
nByte = WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, NULL, 0, NULL, NULL);
// step.2
pANSI = (
char
*)
malloc
(nByte);
// step.3
WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, pANSI, nByte, NULL, NULL);
// step.4
printf_s(
"ANSI = %s\n"
, pANSI);
// step.5
free
(pANSI);
return
0;
}
|