iconv函数使用

介绍 :

        iconv是一个用作转换字符编码的一个库,如gbk转utf8等等。具体支持的编码类型很多这里不具体列举了。

使用:

        1.命令(linux)

         iconv -f utf-8 -t gbk utf8.txt > gbk.txt

         将utf8.txt以utf8的编码格式转化成gbk格式,并输出到gbk.txt中

        2.函数

        首先获取转换的句柄,主要为了设置转换前的格式及转换后的格式

        iconv_t iconv_open(const char *__tocode, const char *__fromcode)

         tocode:    转换后的类型
         fromcode:  转换前的类型

        返回值:        控制的句柄

        然后开始转换

        size_t iconv(iconv_t __cd, char **__restrict__ __inbuf, size_t *__restrict__ __inbytesleft, char **__restrict__ __outbuf, size_t *__restrict__ __outbytesleft)

         cd      句柄
        inbuf   需要转换的内容
        inbytesleft 最多转换的字节数
        outbuf  转换后的内容
        outbytesleft 转换后最多存放在outbuf中的字节数

        返回值 成功应该是返回0吧,失败返回-1.   但是跟原文介绍好像不太一样

RETURN VALUE
       The  iconv()  function  returns the number of characters converted in a
       nonreversible way during this  call;  reversible  conversions  are  not
       counted.  In case of error, it sets errno and returns (size_t) -1.

        最后,关闭

        int iconv_close(iconv_t __cd)

        主要是使用这3个函数。下面给出例程

#include "iconv.h"
#include "fcntl.h"
#include "string.h"
#include "malloc.h"
#include "stdio.h"

/**
 * 文件编码转换
*/
int file_code_convert()
{
    int ret;
    int read_fd = open("utf8.txt",O_RDONLY|O_CREAT);
    int write_fd= open("gbk.txt", O_RDWR|O_CREAT,0666); //建文件时会修改权限
    char read_buf[1024] = {0};
    size_t inLen ,outLen=1024 ;
    char *outbuf = (char*)malloc(1024);
    char *inbuf  = (char*)malloc(1024);     //这两块空间必须malloc,不可以用数组
    char *ob = outbuf;
    char *ib = inbuf;       //用来记录上面两块空间的地址

    inLen = read(read_fd, read_buf,1024);
    memcpy(inbuf,read_buf,inLen);

    /*
        获取转换的句柄
        tocode:    转换后的类型
        fromcode:  转换前的类型
    */
    iconv_t icv = iconv_open("GBK","UTF-8");
    if(*(int*)icv == -1)
    {
        perror("iconv_open");
        return -1;
    }

    /*
        开始转换
        cd      句柄
        inbuf   需要转换的内容
        inbytesleft 最多转换的字节数
        outbuf  转换后的内容
        outbytesleft 转换后最多存放在outbuf中的字节数
        返回值 成功返回0吧
        备注:完成后
            inbytesleft 会返回转换的字节数
            inbuf 会指向偏移 inbuf 字节的长度的地址
            outbytesleft 会返回转换后的长度
            outbuf 也同样会指向偏移 outbytesleft 字节的长度的地址
            所以直接读inbuf和outbuf是读不出转化后内容
    */
    ret = iconv(icv, &inbuf, &inLen ,&outbuf ,&outLen);
    if(ret == -1)
    {
        perror("iconv");
        return -1;
    }

    /*关闭*/
    iconv_close(icv);

    write(write_fd,ob,1024-outLen);
    close(write_fd);
    close(read_fd);
    free(ob);
    free(ib);
    return 0;
}

        注意,iconv传参不能传数组,谨记数组指针是两个概念

`iconv()`函数是用于字符集转换的C标准库函数,主要用于在不同编码之间转换数据。它的基本语法如下: ```c size_t iconv(converter_state *cs, size_t (*inbuf)(void *, void *, size_t, size_t *), size_t (*outbuf)(void *, void *, size_t, size_t *), const char *inbuf_ptr, size_t inbytesleft, char *outbuf_ptr, size_t outbytesleft) ``` 这里参数解释如下: - `cs`: 转换上下文,通常是`iconv_open()`函数返回的结果,表示从一种编码到另一种编码的转换规则。 - `inbuf` 和 `outbuf`: 分别指输入缓冲区和输出缓冲区的读写函数指针。`NULL`表示直接使用内存指针。 - `inbuf_ptr`, `inbytesleft`: 输入缓冲区的地址和剩余字节数。 - `outbuf_ptr`, `outbytesleft`: 输出缓冲区的地址和剩余字节数。 使用`iconv()`的一般步骤包括: 1. **打开转换上下文**: ```c converter_state *cs = iconv_open(dest_encoding, src_encoding); if (cs == (converter_state*)-1) { // 错误处理 } ``` 其中`dest_encoding`和`src_encoding`分别是你想要转换的目标和源编码(如`"UTF-8"`)。 2. **准备数据**: 准备好待转换的数据和空闲的缓冲区。 3. **转换数据**: ```c size_t n = inbytesleft; // 或者根据实际输入和输出缓冲区长度 char *output = malloc(n); // 创建新的输出缓冲区 while (n > 0) { size_t converted; if ((converted = iconv(cs, &input, &n, output, &outbytesleft)) > 0) { // 成功转换了部分数据,处理并更新缓冲区位置 n -= converted; output += converted; } else { // 转换失败或到达结束标志 break; } } ``` 4. **关闭转换上下文**: 当所有的数据都转换完成后,记得释放资源: ```c iconv_close(cs); free(output); ``` 5. **检查错误**: 检查`iconv()`的返回值以及在转换过程中是否有错误发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值