既然不同的平台有字符集的差别,那么在不同平台之间传递数据就需要进行“编码转换”。
本例介绍了如何利用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;
}