C运行库中的字符编码转换

  既然不同的平台有字符集的差别,那么在不同平台之间传递数据就需要进行“编码转换”。

  本例介绍了如何利用C标准库函数对UNICODE编码和多字节编码进行转换,转换目标是将多字节编码(例如GBK编码)字符/字符串与UNICODE编码字符串进行相互转化。

#include <tchar.h>
#include <locale.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

#define BUF_LEN 512

int _tmain(int argc, TCHAR* argv[])
{
	// 定义UNICODE编码字符
	wchar_t wc = L'大';
	// 定义ASCII/GBK编码字符缓冲(其容量可以存放一个中文字符)
	char szChar[3] = "";
	int i, nError;
	
	// 定义UNICODE编码字符串
	const wchar_t* lpcszW = L"Hello, 大家好!";
	// 定义指向ASCII编码字符串的指针
	char* lpszBuffer = NULL;
	// 定义指向UNICODE编码字符串的指针
	wchar_t* lpwcsBuffer = NULL;
	// 定义字符串长度变量
	size_t nLength = 0;    // size_t映射为unsigned int类型
	
	// 设置当前语言环境(中文)
	_tsetlocale(LC_ALL, _T("zhi"));

	// 将UNICODE字符转为对应的ASCII/GBK字符串
	// (一个UNICODE字符占据2个字节,加上/0共三个字节)
	nError = wctomb_s(&i,    // 返回转换后占用的字节数
		szChar,                // 保存转换结果的缓冲数组
		3,                    // 保存转换结果的缓冲数组长度
		wc                    // 要转换的UNICODE字符
	);
	// wctomb_s函数返回0表示运行正确,否则表示运行失败
	if (nError == 0) 
		printf("转换后的字符串为:%s", szChar);
	else
		_tprintf(_T("字符转化失败"));
	
	// 给ASCII/GBK缓冲内存放新汉字
	strcpy_s(szChar, 3, "小");
	// 将一个ASCII/GBK字符串转化为UNICODE字符
	nError = mbtowc(&wc,    // 指向UNICODE字符变量的指针
		szChar,                // 指向要转换ASCII/GBK字符串的指针
		strlen(szChar)        // 要转换ASCII/GBK字符串长度
	);
	
	// mbtowc函数如果运行正确,返回转化结果的字符串长度;返回0表示参数1为/0字符;返回-1表示失败
	if (nError > 0)
		wprintf(L"/n转换后的字符为:%c", wc);
	else
		_tprintf(_T("/n字符转化失败"));
	
	// UNICODE编码转为ASCII编码
	// 第一步,获取缓冲区长度(不包括/0字符)
	nLength = wcstombs(
		NULL,    // 指向待转化的ASCII/GBK字符串缓冲的指针,此时填NULL
		lpcszW,    // 要转化的UNICODE字符串指针
		0        // 参数1缓冲区长度,单位字节
	) + 1;        // 由于函数返回的ASCII/GBK缓冲区长度不包括/0字符,所以结果要加1
	   
	if (nLength == -1 && errno == EILSEQ)
		_tprintf("/n转换失败");
	else 
	{
		// 第二步,分配缓冲区
		if (lpszBuffer = (char*)malloc(nLength)) 
		{
			// 第三步,转化字符串,再次调用wcstombs函数,
			// 此时第1个参数填写上一步分配的缓冲区指针,
			// 第3个参数填写缓冲区长度
			wcstombs(lpszBuffer, lpcszW, nLength);
			printf("/n转化后的字符串为:%s", lpszBuffer);

			// ASCII编码转为UNICODE编码,步骤和解释类似
			// 于与UNICODE编码转为ASCII编码
		   
			// 第一步,获取缓冲区长度
			nLength = mbstowcs(NULL, lpszBuffer, 0) + 1;
			if (nLength == -1 && errno == EILSEQ)
				_tprintf("/n转换失败");
			else {
				// 第二步,分配缓冲区
				if (lpwcsBuffer = (wchar_t*)malloc(nLength * sizeof(wchar_t))) {
					// 第三步,转化字符串
					mbstowcs(lpwcsBuffer, lpszBuffer, nLength);
					wprintf(L"/n转化后的字符串为:%s", lpwcsBuffer);
					free(lpwcsBuffer);
				} else {
					_tprintf(_T("/n内存分配失败"));
				}
			}
			free(lpszBuffer);
		} else
			_tprintf(_T("/n内存分配失败"));
	}
	
	_tprintf(_T("/n"));
	_tsystem(_T("pause"));
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值