现在的位置: 首页 > 综合 > 正文

VS2008编译iconv静态链接库

2013年05月05日 ⁄ 综合 ⁄ 共 5298字 ⁄ 字号 评论关闭

iconv是将一种编码格式转换为另一种编码格式的开源库,例如可以把Windows环境下通用的ASCii(中文是GB2312)编码转换为国际通用的Unicode编码

iconv最新版本只支持MingW和Cygwin编译

1. 下载 iconv 库并解压,目前最新版本为 1.14
         http://ftp.gnu.org/pub/gnu/libiconv/

2、新建一个VC空工程(libIconv)

(1)libIconv工程下新建一个文件夹Iconv

(2)将下载的库中lib文件夹下的所有文件拷贝到这个文件夹下

(3)将烤入到Iconv文件夹下的config.h.in重命名为config.h

(3)将库中libcharset/lib/localcharset.c文件拷贝到这个文件夹下

(4)将库中include文件夹下iconv.h.in文件重命名为iconv.h放在Iconv文件夹下

(5)将库中scrLib/localcharset.h文件拷到Iconv文件夹下

3、工程中添加现有项,将 iconv.c ,localcharset.c 添加到工程中.

4、工程属性->C/C++ –>附加包含目录:../Iconv;

5、工程属性:常规->配置类型->静态库(.lib)

6、修改文件中的BUG:

(1) iconv.h :

1).删除掉所有的 @ 符号 (14处) 
2).修改25行: extern DLL_VARIABLE int _libiconv_version;

      为  extern /*DLL_VARIABLE*/ int _libiconv_version;  
3).修改83行:extern size_t iconv (iconv_t cd, ICONV_CONST char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); 

      为 extern size_t iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);

(2)localcharset.c:

      注释掉76行:  # include "configmake.h"  

7、右击解决方案,选择生成解决方案。

得libIconv.lib静态链接库。头文件是iconv.h(Iconv文件夹下)

使用:

#include <iostream>
#include <string>
using namespace std;
#include "iconv.h"
#pragma comment(lib,"iconv.lib")

int code_convert(char *from_charset,char *to_charset,const char *inbuf, size_t inlen,char *outbuf, size_t outlen)
{
iconv_t cd;
const char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd, pin, &inlen,pout, &outlen)==-1) return -1;
iconv_close(cd);
return 0;
}

* UTF-8 to GBK  */
int u2g(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert("UTF-8","GBK",inbuf,inlen,outbuf,outlen);
}

* GBK to UTF-8 */
int g2u(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert("GBK", "UTF-8", inbuf, inlen, outbuf, outlen);
}

void readFile(const char* pchFileName,string &strFileContent)
{
char* buffer = NULL;
int nLen = 0;
FILE *fp = fopen(pchFileName,"rb");
if (fp == NULL)
{
cout << pchFileName << " open failed!" << endl;
exit(1);
}

fseek(fp,0L,SEEK_END);      //文件指针移到文件尾  
long fsize = ftell(fp);     //得到当前指针位置,既文件的长度
rewind(fp);                 //文件指针恢复到文件头位置
//动态申请空间,为保存字符串结尾标志'\0',多申请一个字符的空间。
buffer = (char*)malloc(sizeof(char)*fsize+1);
if (buffer == NULL)
{
cout << "memory error!" << endl;
fclose(fp); //不再使用文件,关闭
exit(1);
}

nLen=fread(buffer,sizeof(char),fsize,fp);
buffer[nLen] = '\0';//添加字符串结尾标志
string strBuffer(buffer);
strFileContent = strBuffer;
free(buffer);
buffer = NULL;//释放后也要把指针设成NULL,避免野指针。
fclose(fp);
}

int main()
{

string strFileContent;
readFile("3.txt",strFileContent);
cout << strFileContent << endl;

size_t iInBytes,oOutBytes;
iInBytes = strFileContent.length();
oOutBytes = 3*iInBytes+1;
char *pchDestStr = new char[oOutBytes];
memset(pchDestStr,0,oOutBytes);
g2u(strFileContent.c_str(),iInBytes,pchDestStr,oOutBytes);
cout << pchDestStr << endl;

system("pause");
return 0;
}

iconv是将一种编码格式转换为另一种编码格式的开源库,例如可以把Windows环境下通用的ASCii(中文是GB2312)编码转换为国际通用的Unicode编码

iconv最新版本只支持MingW和Cygwin编译

1. 下载 iconv 库并解压,目前最新版本为 1.14
         http://ftp.gnu.org/pub/gnu/libiconv/

2、新建一个VC空工程(libIconv)

(1)libIconv工程下新建一个文件夹Iconv

(2)将下载的库中lib文件夹下的所有文件拷贝到这个文件夹下

(3)将烤入到Iconv文件夹下的config.h.in重命名为config.h

(3)将库中libcharset/lib/localcharset.c文件拷贝到这个文件夹下

(4)将库中include文件夹下iconv.h.in文件重命名为iconv.h放在Iconv文件夹下

(5)将库中scrLib/localcharset.h文件拷到Iconv文件夹下

3、工程中添加现有项,将 iconv.c ,localcharset.c 添加到工程中.

4、工程属性->C/C++ –>附加包含目录:../Iconv;

5、工程属性:常规->配置类型->静态库(.lib)

6、修改文件中的BUG:

(1) iconv.h :

1).删除掉所有的 @ 符号 (14处) 
2).修改25行: extern DLL_VARIABLE int _libiconv_version;

      为  extern /*DLL_VARIABLE*/ int _libiconv_version;  
3).修改83行:extern size_t iconv (iconv_t cd, ICONV_CONST char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); 

      为 extern size_t iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);

(2)localcharset.c:

      注释掉76行:  # include "configmake.h"  

7、右击解决方案,选择生成解决方案。

得libIconv.lib静态链接库。头文件是iconv.h(Iconv文件夹下)

使用:

#include <iostream>
#include <string>
using namespace std;
#include "iconv.h"
#pragma comment(lib,"iconv.lib")

int code_convert(char *from_charset,char *to_charset,const char *inbuf, size_t inlen,char *outbuf, size_t outlen)
{
iconv_t cd;
const char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd, pin, &inlen,pout, &outlen)==-1) return -1;
iconv_close(cd);
return 0;
}

* UTF-8 to GBK  */
int u2g(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert("UTF-8","GBK",inbuf,inlen,outbuf,outlen);
}

* GBK to UTF-8 */
int g2u(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert("GBK", "UTF-8", inbuf, inlen, outbuf, outlen);
}

void readFile(const char* pchFileName,string &strFileContent)
{
char* buffer = NULL;
int nLen = 0;
FILE *fp = fopen(pchFileName,"rb");
if (fp == NULL)
{
cout << pchFileName << " open failed!" << endl;
exit(1);
}

fseek(fp,0L,SEEK_END);      //文件指针移到文件尾  
long fsize = ftell(fp);     //得到当前指针位置,既文件的长度
rewind(fp);                 //文件指针恢复到文件头位置
//动态申请空间,为保存字符串结尾标志'\0',多申请一个字符的空间。
buffer = (char*)malloc(sizeof(char)*fsize+1);
if (buffer == NULL)
{
cout << "memory error!" << endl;
fclose(fp); //不再使用文件,关闭
exit(1);
}

nLen=fread(buffer,sizeof(char),fsize,fp);
buffer[nLen] = '\0';//添加字符串结尾标志
string strBuffer(buffer);
strFileContent = strBuffer;
free(buffer);
buffer = NULL;//释放后也要把指针设成NULL,避免野指针。
fclose(fp);
}

int main()
{

string strFileContent;
readFile("3.txt",strFileContent);
cout << strFileContent << endl;

size_t iInBytes,oOutBytes;
iInBytes = strFileContent.length();
oOutBytes = 3*iInBytes+1;
char *pchDestStr = new char[oOutBytes];
memset(pchDestStr,0,oOutBytes);
g2u(strFileContent.c_str(),iInBytes,pchDestStr,oOutBytes);
cout << pchDestStr << endl;

system("pause");
return 0;
}

抱歉!评论已关闭.