zoukankan      html  css  js  c++  java
  • 用linux的iconv函数 转换编码

    inux shell 配置文件中默认的字符集编码为UTF-8 。UTF-8是unicode的一种表达方式,gb2312是和unicode都是字符的编码方式,所以说gb2312跟utf-8的概念应该不是一个层次上的。在LINUX上进行编码转换时,可以利用iconv命令实现,这是针对文件的,即将指定文件从一种编码转换为另一种编码。
           查了下iconv命令用法如下:
    iconv [选项...] [文件...]

    有如下选项可用:

    输入/输出格式规范:
    -f, --from-code=名称 原始文本编码
    -t, --to-code=名称 输出编码

    信息:
    -l, --list 列举所有已知的字符集

    输出控制:
    -c 从输出中忽略无效的字符
    -o, --output=FILE 输出文件
    -s, --silent 关闭警告
    --verbose 打印进度信息

    所以,我在程序的末尾直接加了一句
    iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt > /server_test/reports/software_asserts.txt
    解决了问题。

    在网上查了些资料还知道在LINUX上进行编码转换时,还可以利用iconv函数族编程实现。

    iconv函数族的头文件是iconv.h,使用前需包含之。
    #include <iconv.h>
    iconv函数族有三个函数,原型如下:
    (1) iconv_t iconv_open(const char *tocode, const char *fromcode);
    此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
    (2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
    此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。 (3) int iconv_close(iconv_t cd);
    此函数用于关闭转换句柄,释放资源。
    例子1: 用C语言实现的转换示例程序

    /* f.c : 代码转换示例C程序 */
    #include <iconv.h>
    #define OUTLEN 255
    main()
    {
    char *in_utf8 = "姝e?ㄥ??瑁?";
    char *in_gb2312 = "正在安装";
    char out[OUTLEN];

    //unicode码转为gb2312码
    rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
    printf("unicode-->gb2312 out=%sn",out);
    //gb2312码转为unicode码
    rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
    printf("gb2312-->unicode out=%sn",out);
    }
    //代码转换:从一种编码转为另一种编码
    int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
    {
    iconv_t cd;
    int rc;
    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;
    }
    //UNICODE码转为GB2312码
    int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
    {
    return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
    }
    //GB2312码转为UNICODE码
    int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
    {
    return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
    }

    例子2: 用C++语言实现的转换示例程序

    /* f.cpp : 代码转换示例C++程序 */
    #include <iconv.h>
    #include <iostream>

    #define OUTLEN 255

    using namespace std;

    // 代码转换操作类
    class CodeConverter {
    private:
    iconv_t cd;
    public:
    // 构造
    CodeConverter(const char *from_charset,const char *to_charset) {
    cd = iconv_open(to_charset,from_charset);
    }

    // 析构
    ~CodeConverter() {
    iconv_close(cd);
    }

    // 转换输出
    int convert(char *inbuf,int inlen,char *outbuf,int outlen) {
    char **pin = &inbuf;
    char **pout = &outbuf;

    memset(outbuf,0,outlen);
    return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
    }
    };

    int main(int argc, char **argv)
    {
    char *in_utf8 = "姝e?ㄥ??瑁?";
    char *in_gb2312 = "正在安装";
    char out[OUTLEN];

    // utf-8-->gb2312
    CodeConverter cc = CodeConverter("utf-8","gb2312");
    cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN);
    cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl;

    // gb2312-->utf-8
    CodeConverter cc2 = CodeConverter("gb2312","utf-8");
    cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);
    cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl;
    }
  • 相关阅读:
    POJ 1469 COURSES 二分图最大匹配
    POJ 1325 Machine Schedule 二分图最大匹配
    USACO Humble Numbers DP?
    SGU 194 Reactor Cooling 带容量上下限制的网络流
    POJ 3084 Panic Room 求最小割
    ZOJ 2587 Unique Attack 判断最小割是否唯一
    Poj 1815 Friendship 枚举+求最小割
    POJ 3308 Paratroopers 最小点权覆盖 求最小割
    1227. Rally Championship
    Etaoin Shrdlu
  • 原文地址:https://www.cnblogs.com/jing1617/p/8690673.html
Copyright © 2011-2022 走看看