VC编译iconv库

 

iconv库可以实现编码格式转换,默认为Linux版本,如果要在windows下使用,需要在VC下重新编译

 

1. 下载 iconv 库 http://ftp.gnu.org/pub/gnu/libiconv/   在这个地址下载想要的版本

2. VC6新建win32静态库工程,libIconv。复制iconv库lib文件夹所有文件到工程文件夹下

3. 将config.h.in改名为config.h

4. 将libcharset/lib/localcharset.c复制过来

5. 将include文件夹下iconv.h.in复制过来,改名为iconv.h

6. 将库中scrLib/localcharset.h复制过来

7. 工程属性, C/C++,Preprocssor, Addtional include diretory增加当前文件夹"."

8. 修改 iconv.h :

   a. 删除所有的 @ 符号,

   b. 注释掉/*DLL_VARIABLE*/,

   c. ICONV_CONST改为const,

9. 修改localcharset.c:

    注释掉 #include"configmake.h" 

10. 把有main函数的.c文件删掉

 

生成libIconv.lib,头文件即iconv.h

 

注:在VS2008中第2步注意

,可以先建立一个空工程,进入工程属性,常规->配置类型->静态库(.lib)

VC6编译的库不能在VS2008下用,要在VS2008重新编译

 

///

///

///

下面是验证代码(复制自VLC):

#include <iconv.h>
#include <stdio.h>
#include <stdlib.h>
 
#pragma comment(lib,"libIconv.lib")
 
static char *dvbsi_to_gb2312( char*psz_instring, size_t i_length )
{
   char *psz_encoding, *psz_stringstart, *psz_outstring, *psz_tmp;
   char psz_encbuf[12];
   size_t i_in, i_out;
   iconv_t iconv_handle;
   if( i_length < 1 ) return NULL;
   if( psz_instring[0] >= 0x20 )
    {
       psz_stringstart = psz_instring;
       psz_encoding = "ISO_8859-1"; /* should be ISO6937 according tospec,
but this seems to be the one used */
    }else switch( psz_instring[0] )
    {
   case 0x01:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-5";
       break;
   case 0x02:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-6";
       break;
   case 0x03:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-7";
       break;
   case 0x04:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-8";
       break;
   case 0x05:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-9";
       break;
   case 0x06:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-10";
       break;
   case 0x07:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-11";
       break;
   case 0x08:
       psz_stringstart = &psz_instring[1]; /*possibly reserved?*/
       psz_encoding = "ISO_8859-12";
       break;
   case 0x09:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-13";
       break;
   case 0x0a:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-14";
       break;
   case 0x0b:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "ISO_8859-15";
       break;
       //     case 0x10:
       //         if( i_length < 3 ||psz_instring[1] != '\0' || psz_instring
[2] > 0x0f
       //             || psz_instring[2]== 0 )
       //             returnEnsureUTF8(strndup(psz_instring,i_length));
       //         sprintf( psz_encbuf,"ISO_8859-%d", psz_instring[2] );
       //         psz_stringstart =&psz_instring[3];
       //         psz_encoding =psz_encbuf;
       //         break;
   case 0x11:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "UTF-16";
       break;
   case 0x12:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "KSC5601-1987";
       break;
   case 0x13:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "GB2312";/*GB-2312-1980 */
       break;
   case 0x14:
       psz_stringstart = &psz_instring[1];
       psz_encoding = "BIG-5";
       break;
       //     case 0x15:
       //         returnEnsureUTF8(strndup(&psz_instring[1],i_length-1));
       //         break;
   default:
       /* invalid */
       return NULL; // todo EnsureUTF8(strndup(psz_instring,i_length));
    }
   iconv_handle = iconv_open( "GB2312", psz_encoding );
   i_in = i_length - (psz_stringstart - psz_instring );
   i_out = i_in * 6;
   psz_outstring = psz_tmp = (char*)malloc( i_out * sizeof(char) + 1 );
   iconv( iconv_handle, (const char **)&psz_stringstart, &i_in,&psz_tmp, &
i_out );
   iconv_close( iconv_handle );
   *psz_tmp = '\0';
   return psz_outstring;
}
 
int main()
{
   char a[] = {0x11, 0x73, 0xAF, 0x74, 0x03, 0x65, 0xC5, 0x6E, 0x38, 0x00};
   char *b = dvbsi_to_gb2312(a, sizeof(a));
 
   printf("%s\r\n", b);
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值