Win32编码转换

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

你可能感兴趣的:(Win32编码转换)