• VS2008编译iconv静态链接库


    iconv是将一种编码格式转换为还有一种编码格式的开源库,比如能够把Windows环境下通用的ASCii(中文是GB2312)编码转换为国际通用的Unicode编码

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

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

    2、新建一个VC空project(libIconv)

    (1)libIconvproject下新建一个目录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、project中加入现有项,将 iconv.c ,localcharset.c 加入到project中.

    4、project属性->C/C++ –>附加包括文件夹:../Iconv;

    5、project属性:常规->配置类型->静态库(.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);                 //文件指针恢复到文件头位置
    //动态申请空间,为保存字符串结尾标志''。多申请一个字符的空间。
    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] = '';//加入字符串结尾标志
    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;
    }


  • 相关阅读:
    HTML元素事件说明
    JQuery基本方法介绍和使用
    Eclipse设置注释模板
    AJAX回调(调用后台方法返回数据)
    Hibernate常用增删改查方法
    C memset
    PAT-Top1002. Business (35)
    PAT-Top1001. Battle Over Cities
    聂老师的考验(反向bfs)
    CSUST选拔赛题解
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5135871.html
Copyright © 2020-2023  润新知