C/C++ 编程中多国语言处理
[09-12 18:29:52] 来源:http://www.88dzw.com EDA/PLD 阅读:8348次
文章摘要:这里以 MBs2WCs 函数的实现说明 GB2312 向 Unicode 的转换的主要过程:清单 1. 多字节字符串向宽字节字符串转换wchar_t*MBs2WCs(constchar*pszSrc){wchar_t*pwcs=NULL;intsize=0;#ifdefined(_linux_)setlocale(LC_ALL,"zh_CN.GB2312");size=mbstowcs(NULL,pszSrc,0);pwcs=newwchar_t[size+1];size=mbstowcs(pwcs,pszSrc,size+1);pwcs[size]=0;#elsesize
C/C++ 编程中多国语言处理,标签:eda技术,eda技术实用教程,http://www.88dzw.com这里以 MBs2WCs 函数的实现说明 GB2312 向 Unicode 的转换的主要过程:
清单 1. 多字节字符串向宽字节字符串转换
wchar_t * MBs2WCs(const char* pszSrc){
wchar_t* pwcs = NULL;
intsize = 0;
#ifdefined(_linux_)
setlocale(LC_ALL, "zh_CN.GB2312");
size = mbstowcs(NULL,pszSrc,0);
pwcs = new wchar_t[size+1];
size = mbstowcs(pwcs, pszSrc, size+1);
pwcs[size] = 0;
#else
size = MultiByteToWideChar(20936, 0, pszSrc, -1, 0, 0);
if(size <= 0)
returnNULL;
pwcs = new wchar_t[size];
MultiByteToWideChar(20936, 0, pszSrc, -1, pwcs, size);
#endif
returnpwcs;
}
相应的,WCs2MBs 可以将宽字符串转化为字节流。
清单 2. 宽字节字符串向多字节字符串转换
char* WCs2MBs(const wchar_t * wcharStr){
char* str = NULL;
intsize = 0;
#ifdefined(_linux_)
setlocale(LC_ALL, "zh_CN.UTF8");
size = wcstombs( NULL, wcharStr, 0);
str = new char[size + 1];
wcstombs( str, wcharStr, size);
str[size] = '\0';
#else
size = WideCharToMultiByte( CP_UTF8, 0, wcharStr, -1, NULL, NULL, NULL, NULL );
str = new char[size];
WideCharToMultiByte( CP_UTF8, 0, wcharStr, -1, str, size, NULL, NULL );
#endif
returnstr;
}
Linux 的 setlocale 的具体使用可以参阅有 C/C++ 文档,它关系到文字、货币单位、时间等很多格式问题。Windows 相关的代码中 20936 和宏定义 CP_UTF8 是 GB2312 编码对应的的 Code Page[ 类似的 Code Page 参数可以从 MSDN的 Encoding Class 有关信息中获得 ]。
这里需要特别指出的是 setlocale 的第二个参数,Linux 和 Windows 是不同的:
1. 笔者在 Eclipse CDT + MinGW 下使用 [country].[charset](如 zh_CN.gb2312 或 zh_CN.UTF8)的格式并不能通过编码转换测试,但可以使用 Code Page,即可以写成 setlocale(LC_ALL, ".20936") 这样的代码。这说明,这个参数与编译器无关,而与系统定义有关,而不同操作系统对于已安装字符集的定义是不同的。
2. Linux 系统下可以参见 /usr/lib/locale/ 路径,系统所支持的 locale 都在这里。转换成 UTF8 时,并不需要 [country] 部分一定是 zh_CN,en_US.UTF8 也可以正常转换。
另外,标准 C 和 Win32 API 函数返回值是不同的,标准 C 返回的 wchar_t 数组或者是 char 数组都没有字符串结束符,需要手动赋值,所以 Linux 部分的代码要有区别对待。
最后,还要注意应当在调用这两个函数后释放分配的空间。如果将 MBs2WCs 和 WCs2MBs 的返回值分别转化为 wstring 和 string,就可以在它们函数体内做 delete,这里为了代码简明,故而省略,但请读者别忘记。
第三方库
目前的第三方工具已经比较完善,这里介绍两个,本文侧重点不在此,不对其做太多探讨。
Linux 上存在第三方的 iconv 项目,使用也较为简单,其实质也是以 Unicode 作为转换的中介。
ICU 是一个很完善的国际化工具。其中的 Code Page Conversion 功能也可以支持文本数据从任何字符集向 Unicode 的双向转换。
实验测试
在代码中调用“编码转换方法”一节里提到的函数,将 gb2312 编码的字符串转换为 UTF8 编码,分析其编码转换的行为:
在英文 Linux 环境下,执行下列命令:
export LC_ALL=zh_CN.gb2312
然后编译并执行以下程序(其中汉字都是在 gb2312 环境中写入源文件)
L1: wstring ws = L"一";
L2: string s_gb2312 = "一";
L3: wchar_t * wcs = MBs2WChar(s_gb2312.c_str());
《C/C++ 编程中多国语言处理》相关文章
- › UCC3895N内部等效电路图
- › CCD驱动电路图
- › 新型彩灯花样控制专用集成电路CCDD-1B电路图
- › 用TL494制作的CCFL灯驱动电路图
- › Tcc系列硅光电池外形电路图
- › CCl020 ASK/FSK/GFSK 848~940 MHz/424~470 MHz低功率收发器
- 在百度中搜索相关文章:C/C++ 编程中多国语言处理
- 在谷歌中搜索相关文章:C/C++ 编程中多国语言处理
- 在soso中搜索相关文章:C/C++ 编程中多国语言处理
- 在搜狗中搜索相关文章:C/C++ 编程中多国语言处理