`
huangro
  • 浏览: 333396 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用iconv做通用的语言编码转换(转)

阅读更多
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>

#ifndef ICONV_CONST
# define ICONV_CONST const
#endif

/*!
对字符串进行语言编码转换
param from   原始编码,比如"GB2312",的按照iconv支持的写
param to       转换的目的编码
param save   转换后的数据保存到这个指针里,需要在外部分配内存
param savelen 存储转换后数据的内存大小
param src       原始需要转换的字符串
param srclen     原始字符串长度
*/
int
convert(const char *from, const char *to, char* save, int savelen, char *src, int srclen)
{
     iconv_t cd;
    char   *inbuf = src;
    char *outbuf = save;
     size_t outbufsize = savelen;
    int status = 0;
     size_t   savesize = 0;
     size_t inbufsize = srclen;
    const char* inptr = inbuf;
     size_t       insize = inbufsize;
    char* outptr = outbuf;
     size_t outsize = outbufsize;
    
     cd = iconv_open(to, from);
     iconv(cd,NULL,NULL,NULL,NULL);
    if (inbufsize == 0) {
         status = -1;
        goto done;
     }
    while (insize > 0) {
         size_t res = iconv(cd,(ICONV_CONST char**)&inptr,&insize,&outptr,&outsize);
        if (outptr != outbuf) {
            int saved_errno = errno;
            int outsize = outptr - outbuf;
             strncpy(save+savesize, outbuf, outsize);
             errno = saved_errno;
         }
        if (res == (size_t)(-1)) {
            if (errno == EILSEQ) {
                int one = 1;
                 iconvctl(cd,ICONV_SET_DISCARD_ILSEQ,&one);
                 status = -3;
             } else if (errno == EINVAL) {
                if (inbufsize == 0) {
                     status = -4;
                    goto done;
                 } else {
                    break;
                 }
             } else if (errno == E2BIG) {
                 status = -5;
                goto done;
             } else {
                 status = -6;
                goto done;
             }
         }
     }
     status = strlen(save);
done:
     iconv_close(cd);
    return status;

}
分享到:
评论

相关推荐

    Android NDK使用Iconv进行编码转换

    Android NDK(Native Development Kit)提供了一种方法来实现这样的编码转换,这就是使用Iconv库。Iconv是一个广泛使用的字符集转换工具,它允许在多种字符编码之间进行转换,包括Unicode、GBK和UTF-8。 Iconv在C/...

    ICONV 字符转换 编码库

    总之,`ICONV`字符转换库是处理编码转换问题的重要工具,它为开发者提供了便利,使得在不同编码系统间的数据交换变得简单和可靠。无论是编程还是日常文件处理,理解并掌握`ICONV`的使用都对提升工作效率大有裨益。

    iconv字符编码转换的操作实例

    "iconv字符编码转换的操作实例"这个标题表明我们将探讨如何使用iconv库在C++环境中进行字符编码的转换。iconv是一个广泛使用的跨平台库,用于在不同字符编码之间进行转换,例如从GBK(中国的常见编码)转换到UTF-8...

    C语言字符编码转换UNICODE、GBK、UTF-8互相转换

    总之,C语言虽然没有内置的字符编码转换机制,但通过理解不同编码的原理和使用适当的库或API,可以实现UNICODE、GBK和UTF-8之间的转换。在进行这样的编程时,确保充分理解字符编码的细节,以及处理异常情况的方法,...

    Discuz 提供的编码转换工具

    【标题】"Discuz 提供的编码转换工具"涉及到的是网站论坛系统Discuz!中的一种常见操作,即字符编码的转换。在互联网发展的初期,不同的字符编码标准(如GBK和UTF-8)导致了跨平台、跨语言交流时的数据不兼容问题。...

    编码之间的转换

    在Ruby中,我们可以使用`Iconv`类或者`String#encode`方法来实现编码转换。 例如,如果我们有一个GBK编码的字符串,需要转换为UTF-8,可以使用以下Ruby代码: ```ruby require 'iconv' # 假设原始GBK编码的字符串...

    iconv rar 源文件 库文件

    iconv是一个广泛使用的字符编码转换工具,主要用于在不同的字符编码之间进行转换,以解决不同系统或应用程序之间的文本兼容性问题。在IT行业中,理解和使用iconv对于处理多语言环境下的数据交换至关重要。以下是对...

    C 编码格式转换(32位)

    在C语言中,进行编码转换通常会用到库函数,如`libiconv`或`libcurl`。`libiconv`是一个通用的字符集转换库,它支持多种编码间的转换,包括GBK、UTF-8等。`libcurl`则是一个用于HTTP和其他网络协议交互的库,虽然...

    php大批量文件编码转换 v1.0

    不同的编码方式适用于不同的场景,例如UTF-8是全球通用的标准编码,支持多种语言,而GBK是中国大陆常用的一种编码,包含更多的中文字符。 该工具的核心功能在于批量转换,这意味着你可以一次性处理整个文件夹中的...

    编码转换iocnv

    "编码转换iocnv"这个主题涉及到C++编程语言中的iconv库,以及在Windows 2010环境下如何使用该库进行字符编码的转换。本文将深入探讨iconv库的功能、在Windows上的应用以及如何在C++项目中集成和使用它。 首先,...

    模板编码转换

    5. **工具与库**:许多编程语言都有专门用于处理编码转换的库,如Python的`codecs`模块、Java的`CharsetEncoder`和`CharsetDecoder`,以及Node.js的`iconv-lite`模块。了解如何使用这些工具是关键。 6. **跨平台...

    iconv-1.14-win32-x86_64

    iconv-1.14-win32-x86_64是一个针对Windows 32位x86_64架构的iconv库版本,它主要用于字符编码转换。iconv是Unicode编码与各种其他字符编码之间转换的一个工具,广泛应用于跨语言环境的软件开发中,以确保数据在不同...

    iconv库函数的学习程序

    通过阅读和分析这个文件,你可以了解如何在D语言项目中集成iconv库,并学习如何利用D语言的特性来操作和管理编码转换。 "LibiconvForD.rar"是一个包含D语言版本的libiconv库的压缩文件。libiconv是一个开源的、跨...

    PHP 不同编码的转换程序

    在IT行业中,尤其是在Web开发领域,编码转换是一个常见的任务,特别是在处理多源数据或与不同系统交互时。PHP作为一款广泛使用的服务器端脚本语言,提供了处理和转换各种字符编码的功能。本文将深入探讨PHP中关于...

    基于PHP的Unicode编码转换程序源码.zip

    通过分析这个文件,我们可以学习到如何在PHP中处理字符串编码,例如使用`ord()`和`chr()`函数操作单个字符,或者使用`iconv()`或`mb_convert_encoding()`函数进行整个字符串的编码转换。 在深入研究这个源码时,...

    iconv测试,c语言

    此程序旨在演示如何利用`iconv`库来进行字符编码转换。`iconv`是GNU C库的一部分,用于处理不同字符集之间的转换。 #### 程序结构与功能 该程序主要由以下几个部分组成: 1. **头部文件引入**: - `&lt;iconv.h&gt;`:...

    繁简体转换代码繁简体转换

    GBK是GB2312的扩展,包含了更多的汉字和符号,包括部分繁体字,而Unicode则是一个全球通用的编码标准,可以涵盖世界上大部分语言,包括简体和繁体中文。 "cn_zhn.html"可能是一个HTML文件,它可能包含了一个网页...

    cocos2d-x 3.4 中文乱码解决 iconv库

    如果在Cocos2d-x中,你经常需要进行编码转换,可以封装一个通用的函数或类,将上述步骤集成在一起,方便重复使用。同时,注意处理可能出现的错误情况,例如内存不足、不支持的编码或无效的编码字符串等。 总的来说...

    pb12 gb转utf-8

    标题中的“pb12 gb转utf-8”指的是在编程领域中进行的一种字符编码转换操作。PB12可能是指PowerBuilder 12,一个流行的Windows应用程序开发工具,而GB和UTF-8则涉及到字符编码标准。 GB(通常指的是GBK或GB2312)是...

Global site tag (gtag.js) - Google Analytics