使用API编程,要额外搞清楚“代码页”的概念,这里不再介绍,请自行查找资料,中国汉字代码页为936。
#include <tchar.h>
#include <stdio.h>
#include <locale.h>
#include <windows.h>
int _tmain(int argc, TCHAR* argv[])
{
// 定义被转化的字符串常量指针
const char* lpcszS = "测试用例";
int nLen = 0;
// 指向保存UNICODE字符集缓冲区的指针
wchar_t* lpwcsBuffer = NULL;
// 指向保存ASCII/GBK字符集缓冲区的指针
char* lpszBuffer = NULL;
int nStrLength =0;
// 设置语言环境
_tsetlocale(LC_ALL, _T("zhi"));
// 调用API进行ASCII/GBK向UNICODE字符集转换
// 第1步:获取保存转换结果缓冲区长度
nLen = MultiByteToWideChar(
936, // 代码页
0, // 附加标志, 此处填0, 取Windows默认值
lpcszS, // 要转换的字符串指针
-1, // 要转换的字符串长度, 此处填-1, 表示由函数自行测量
NULL, // 存放结果的缓冲区指针, 填NULL表示本次仅测量转换结果长度, 不做实际转化
0 // 存放结果的缓冲区长度, 填0表示本次仅测量转换结果长度, 不做实际转化
);
// MultiByteToWideChar返回0表示函数调用错误, 否则返回转换结果缓冲区长度
if (nLen == 0)
_tprintf(_T("转换失败, 错误代码 %d"), GetLastError());
else
{
// 第2步:分配内存
if (lpwcsBuffer = (wchar_t*)malloc(nLen * sizeof(wchar_t)))
{
// 第3步:转化。再次调用MultiByteToWideChar函数,
// 此时参数5为指向上一部分配缓冲区的指针, 参数6为缓冲区长度
MultiByteToWideChar(936, 0, lpcszS, -1, lpwcsBuffer, nLen);
wprintf(L"转换结果 %s", lpwcsBuffer);
// 调用API进行UNICODE向ASCII/GBK字符集转换
// 第1步:获取保存转换结果缓冲区长度
nLen = WideCharToMultiByte(
936, // 代码页
0, // 附加标志, 此处填0, 取Windows默认值
lpwcsBuffer, // 要转换的字符串指针
-1, // 要转换的字符串长度, 此处填-1, 表示由函数自行测量
NULL, // 存放结果的缓冲区指针, 填NULL表示本次仅测量转换结果长度, 不做实际转化
0, // 存放结果的缓冲区长度, 填0表示本次仅测量转换结果长度, 不做实际转化
"", // 如果转化失败, 则填入目标缓冲区的默认字符串
NULL // NULL表示忽略;非NULL表示一个指向int类型变量的指针(传出布尔值), 用于表示是否使用了默认字符串
);
if (nLen == 0)
_tprintf(_T("/n转换失败, 错误代码 %d"), GetLastError());
else
{
// 第2步:分配缓冲区
if (lpszBuffer = (char*)malloc(nLen))
{
// 第3步:转化, 再次调用WideCharToMultiByte函数,
// 第5个参数填写第2步分配的缓冲区指针, 第6个参数填写缓冲区的长度
WideCharToMultiByte(936, 0, lpwcsBuffer, -1, lpszBuffer, nLen, "", NULL);
wprintf(L"/n转换结果 %s", lpwcsBuffer);
free(lpszBuffer);
}
else
_tprintf(_T("内存分配错误"));
}
free(lpwcsBuffer);
}
else
_tprintf(_T("内存分配错误"));
}
///
// 上述是MultiByteToWideChar和WideCharToMultiByte函数的基本用法,
// 这里注意两点
// 1、选择合适的代码页, 对于UNICODE编码, 是无所谓代码页的, 代码页具体
// 指如何处理基于ASCII编码的字符(例如GBK)
// 2、两个函数的第4个参数都填为-1, 表示函数自行测量待转换字符串长度,
// 如果待转换字符串长度已知, 则不应由函数来重复测量, 以节省计算时间
///
_tprintf(_T("/n"));
// 事先测量好字符串长度
// 注意结果增加的1, 表示测量的字符串长度应该包含/0字符在内
nStrLength = strlen(lpcszS) + 1;
// CP_ACP宏的值为0,
// 表示当前Windows操作系统使用的代码页, 如果在中文系统上, 则为936
nLen = MultiByteToWideChar(CP_ACP, 0, lpcszS, nStrLength, lpwcsBuffer, 0);
if (nLen == 0)
_tprintf(_T("/n转换失败, 错误代码 %d"), GetLastError());
else
{
if (lpwcsBuffer = (wchar_t*)malloc(nLen * sizeof(wchar_t)))
{
MultiByteToWideChar(CP_ACP, 0, lpcszS, nStrLength, lpwcsBuffer, nLen);
wprintf(L"/n转换结果 %s", lpwcsBuffer);
// 设置nStrLength变量的值为nLen, 即lpwcsBuffer中字符串的长度(包含L'/0'字符)
nStrLength = nLen;
nLen = WideCharToMultiByte(CP_ACP, 0, lpwcsBuffer, nStrLength, NULL, 0, "", NULL);
if (nLen == 0)
_tprintf(_T("/n转换失败, 错误代码 %d"), GetLastError());
else
{
if (lpszBuffer = (char*)malloc(nLen))
{
WideCharToMultiByte(CP_ACP, 0, lpwcsBuffer, nStrLength, lpszBuffer, nLen, "", NULL);
wprintf(L"/n转换结果 %s", lpwcsBuffer);
free(lpszBuffer);
}
else
_tprintf(_T("/n内存分配错误"));
}
free(lpwcsBuffer);
}
else
_tprintf(_T("内存分配错误"));
}
_tprintf(_T("/n"));
_tsystem(_T("pause"));
return 0;
}