在软件开发中不可避免的需要用到字符集的转换;转换方法很多如自行编写字符集转换库、利用
Windows
提供之
MultiByteToWideChar
函数等;自行编写相对周期较长,而利用
MultiByteToWideChar
等函数进行转换在跨平台移值时带来很大的不方便;所以在本文里我们将讲述如何利用在
Linux
与
Windows
下都可用的
libiconv
库进行字符集的转换。
我们可以从
http://www.gnu.org/software/libiconv/
上下载最新版本的
libiconv
;本文里以
libiconv-1.9.2-1.exe
为例子说明安装与使用方法;
libiconv
的安装非常的方便,就和大多数的
Windows
应用程序安装一样直接
Step by Step
就可以了;在安装过程中会提示你是否下载源代码,源代码说白了对我们也没有多大的用处所以就不选择下载源代码;安装完之后在
libiconv
的安装目录下的
man/pdf
目录中有一个
libiconv-man.pdf
,这个文件就是
libiconv
相关函数的说明;所以如果你对
libiconv
还不是很熟悉的话请看一下这个文件。
为了在
VC6
中使用
libiconv
库我们必需对
VC6
进行相应的设置;从
VC6
的菜单栏中选择
Tools
à
Options..
,在弹出的对话框中选择
Directories
选项卡,在
Show directories for
下拉框中选择
Include files
,在最下方的
Directories:
中添加上
libiconv
安装目录下的
include
目录,如下图(图
1-1
)所示:
图
1-1
这样我们就配置了
iconv.h
文件查找目录;由于
libiconv
要用到
libiconv.lib
所以接下来我们应该配置一下
libiconv.lib
文件的查找目录;在图
1-1
的
Show directories for
下接框中选择
Library files
,在最下方的
Directories:
列表中添加上
libiconv
安装目录下的
lib
目录;
OK
配置完成点击
OK
按钮就可以了;为了测试方便我们应该所
libiconv
安装目录下之
bin
目录下的
libiconv2.dll
复制到系统的
System32
目录下。
转换例子如下:
#include <stdio.h>
#include <string.h>
//
包函
libiconv
库头文件
#include <iconv.h>
//
导入
libiconv
库
#pragma comment(lib,"libiconv.lib")
int ChangeCode( const char* pFromCode,
const char* pToCode,
const char* pInBuf,
size_t* iInLen,
char* pOutBuf,
size_t* iOutLen );
int main( int argc, char* argv[] )
{
char sInBuf[100];
char sOutBuf[100];
size_t iInLen = 0;
size_t iOutLen = 100;
int iRet;
strcpy( sInBuf, "
测试
Test Source" );
memset( sOutBuf, 0x00, 100 );
iInLen = strlen( sInBuf );
iRet = ChangeCode( "GBK", "UTF-16", sInBuf, &iInLen, sOutBuf, &iOutLen );
return 0;
}
int ChangeCode( const char* pFromCode,
const char* pToCode,
const char* pInBuf,
size_t* iInLen,
char* pOutBuf,
size_t* iOutLen )
{
int iRet;
//
打开字符集转换
iconv_t hIconv = iconv_open( pToCode, pFromCode );
if ( -1 == (int)hIconv )
{
return -1;//
打开失败,可能不支持的字符集
}
//
开始转换
iRet = iconv( hIconv, (const char**)(&pInBuf), iInLen, (char**)(&pOutBuf), iOutLen );
//
关闭字符集转换
iconv_close( hIconv );
return iRet;
}
字符集的转换就是这么的简单;当然如果你有兴趣的话在
Linux
下也去安装一下
libiconv
然后把上面那段代码放到
Linux
下用
gcc
编译一下看看。