使用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; }