`
yangzb
  • 浏览: 3507085 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用iconv进行内码转换(Big5->GB2312)

 
阅读更多

i conv 是一个通过unicode 作为中间码实现各种内码间相互转换的库,它基本上囊括了世界上所有编码方式,例如,ASCIIGB2312 、 GBK 、 GB18030BIG5UTF-8UCS-2UCS-2BEUCS-2LEUCS-4UCS-4BEUCS- 4LEUTF-16 、 UTF-16BEUTF-16LEUTF-32UTF-32BEUTF-32LEUTF-7 等等等,除此之外,还包括 泰语、日语、韩语、西欧等国家语言的编码。下面我们演示如何使用iconv 实现Big5GB2312 的转换,当然只要简单修改一下便可实现iconv 支 持任何编码间的转换。 


下载 
libiconv
linux 版本的iconv ,可在 http://www.gnu.org/software/libiconv/  下载 
iconv
win32 版本可以在 http://gnuwin32.sourceforge.net/packages/libiconv.htm  下载 

SVN
源码 
另外,还有一些演示代码,需要的可以到我的SVN 下载 
http://xcyber.googlecode.com/svn/trunk/Convert/

标签: libiconv , iconv , Big5 , GB2312 ,  大五码  内码

代码片段(1)

[ 代码] [C/C++/Objective-C] 代码

001

/****************************************************************************

002

 *  Big5ToGB2312 - Convert Big5 encoding file to GB2312 encoding file

003

 *  File:

004

 *    Big5ToGb2312.c

005

 *  Description:

006

 *    Convert Big5 encoding file to GB2312 encoding file using iconv library

007

 *  Author:

008

 *    XCyber   email:XCyber@sohu.com

009

 *  Date:

010

 *    August 7, 2008

011

 *  Other:

012

 *    visit http://www.gnu.org/software/libiconv/ for more help of iconv

013

 ***************************************************************************/

014

 

015

 

016

#include <stdio.h>

017

#include <stdlib.h>

018

#include <tchar.h>

019

#include <locale.h>

020

#include "../iconv-1.9.2.win32/include/iconv.h"

021

 

022

//#pragma comment(lib, "../iconv-1.9.2.win32/lib/iconv.lib")  // using iconv dynamic-link lib, iconv.dll

023

#pragma comment(lib, "../iconv-1.9.2.win32/lib/iconv_a.lib")  // using iconv static lib 

024

 

025

#define BUFFER_SIZE 1024   //BUFFER_SIZE must >= 2

026

 

027

 

028

void usage()

029

{

030

    printf("\nBig5ToGB2312 - Convert Big5 encoding file to GB2312 encoding file\n");

031

    printf("XCyber@sohu.com on August 7, 2008\n");

032

    printf("  Usage:\n");

033

    printf("      Big5ToGB2312 [Big5 file(in)]  [GB2312 file(out)]\n\n");

034

}

035

 

036

 

037

int main(int argc, char* argv[])

038

{

039

    FILE * pSrcFile = NULL;

040

    FILE * pDstFile = NULL;

041

 

042

    char szSrcBuf[BUFFER_SIZE];

043

    char szDstBuf[BUFFER_SIZE];

044

 

045

    size_t nSrc  = 0;

046

    size_t nDst  = 0;

047

    size_t nRead = 0;

048

    size_t nRet  = 0;

049

 

050

    char *pSrcBuf = szSrcBuf;

051

    char *pDstBuf = szDstBuf;

052

 

053

    iconv_t icv;

054

    int argument = 1;

055

 

056

    //check input arguments

057

    if(argc != 3)

058

    {

059

        usage();

060

        return -1;

061

    }

062

 

063

 

064

    pSrcFile = fopen(argv[1],"r");

065

    if(pSrcFile == NULL)

066

    {

067

        printf("can't open source file!\n");

068

        return -1;

069

    }

070

 

071

    pDstFile = fopen(argv[2],"w");

072

   &nbs

073

p;if(pSrcFile == NULL)

074

    {

075

        printf("can't open destination file!\n");

076

        return -1;

077

    }

078

 

079

    //initialize iconv routine, perform conversion from BIG5 to GB2312

080

    //TODO: if you want to perfom other type of coversion, e.g. GB2312->BIG5, GB2312->UTF-8 ...

081

    //just change following two paremeters of iconv_open()

082

    icv = iconv_open("GB2312","BIG5");

083

    if(icv == 0)

084

    {

085

        printf("can't initalize iconv routine!\n");

086

        return -1;

087

    }

088

 

089

    //enable "illegal sequence discard and continue" feature, so that if met illeagal sequence, 

090

    //conversion will continue instead of being terminated

091

    if(iconvctl (icv ,ICONV_SET_DISCARD_ILSEQ,&argument) != 0)

092

    {

093

        printf("can't enable \"illegal sequence discard and continue\" feature!\n");

094

        return -1;

095

    }

096

 

097

    while(!feof(pSrcFile))

098

    {

099

        pSrcBuf = szSrcBuf;

100

        pDstBuf = szDstBuf;

101

        nDst = BUFFER_SIZE;

102

 

103

        // read data from source file

104

        nRead = fread(szSrcBuf + nSrc,sizeof(char),BUFFER_SIZE - nSrc,pSrcFile);

105

        if(nRead == 0)

106

            break;

107

 

108

        // the amount of data to be converted should include previous left data and current read data

109

        nSrc = nSrc + nRead; 

110

 

111

        //perform conversion

112

        nRet = iconv(icv,(const char**)&pSrcBuf,&nSrc,&pDstBuf,&nDst);

113

 

114

        if(nRet == -1)

115

        {

116

            // include all case of errno: E2BIG, EILSEQ, EINVAL

117

            //     E2BIG: There is not sufficient room at *outbuf.

118

            //     EILSEQ: An invalid multibyte sequence has been encountered in the input.

119

            //     EINVAL: An incomplete multibyte sequence has been encountered in the input

120

            // move the left data to the head of szSrcBuf in other to link it with the next data block

121

            memmove(szSrcBuf,pSrcBuf,nSrc);

122

        }

123

 

124

        //wirte data to destination file

125

        fwrite(szDstBuf,sizeof(char),BUFFER_SIZE - nDst,pDstFile);

126

 

127

    }

128

    iconv_close(icv);

129

    fclose(pSrcFile);

130

    fclose(pDstFile);

131

 

132

    printf("conversion complete.\n");

133

 

134

    return;

135

}

分享到:
评论

相关推荐

    php -> 简繁转换

    `bg2gb`这个文件名可能是转换过程中的一个步骤,它可能代表了从Big5编码转换到GB2312编码的过程。这通常发生在处理旧的、使用Big5编码的文件或数据时。 在实际开发中,考虑到跨平台和兼容性问题,我们通常会建议...

    apr-iconv-1.2.1-win32-src.zip

    总结来说,"apr-iconv-1.2.1-win32-src.zip"是一个包含apr-iconv 1.2.1版本Windows 32位源代码的压缩包,对于ActiveMQ这样的中间件开发至关重要,它提供了在多种编码格式间转换的功能,确保了跨平台通信的顺利进行。...

    Node.js-iconv-lite-纯javascript转换字符编码

    `iconv-lite` 支持多种常见的字符编码,如 UTF-8、GBK、BIG5、ISO-8859-1 等,使得开发者能够轻松地在不同编码之间进行转换,避免乱码问题。 在实际应用中,`iconv-lite` 的使用方法非常直观。首先,你需要通过 npm...

    iconv-1.14-win32-x86_64

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

    iconv-文件编码转换

    `iconv` 是一个广泛使用的命令行工具,用于在各种字符编码之间进行转换,确保数据的正确性和可读性。这个工具尤其适用于处理大文件,可以有效地避免出现乱码问题,确保文件内容的完整性和一致性。 ### iconv 的基本...

    Android NDK使用Iconv进行编码转换

    Iconv是一个广泛使用的字符集转换工具,它允许在多种字符编码之间进行转换,包括Unicode、GBK和UTF-8。 Iconv在C/C++编程中非常常见,因为它提供了高效的字符编码转换功能。在Android NDK环境中,我们可以通过编写C...

    PHP编码转换函数utf-gb-big5

    在PHP编程语言中,处理不同字符编码的转换是常见的需求,特别是当涉及到中文字符时,如GBK(GB2312)、Big5和UTF-8等。这些编码标准在中国大陆和台湾地区尤为常见。本篇文章将详细介绍如何在PHP中进行各种编码间的...

    Big5和GB码相互转换的源码

    对于Big5和GB码的转换,主要是依据它们各自的编码规则进行解码和编码。转换过程中,我们需要处理每个字符的编码值,将其从一种编码格式转换为另一种。 以下是一个简单的Python示例,展示了Big5码转GB码的基本思路:...

    iconv.rar - 编码转换工具

    在Windows的cmd环境下,iconv能帮助开发者和用户处理各种字符编码,例如GBK、UTF-8、BIG5等。这些编码标准在不同的地区和应用程序中各有其适用性,如果不进行转换,可能会导致乱码问题。例如,当一个使用UTF-8编码的...

    UTF-8与GB与 Big5之间的转换

    5. **使用专业库**:利用成熟的编码转换库,如Python的`chardet`用于检测原始编码,`iconv`或`unidecode`等工具进行转换,可以提高转换的准确性和稳定性。 了解这些基本概念和技术后,开发者能够更好地处理各种编码...

    CC++ 字符编码的转换(ut8、gb2312)

    Big5则主要应用于台湾和香港地区,是繁体中文的常用编码,它同样使用两个字节表示一个字符,但其编码空间与GB2312和GBK不兼容,因此在处理这两种编码时需要特别注意。 在CC++中进行编码转换,通常需要借助库函数或...

    fpdf生成类外带实例demo(php).rar

    $pdf-&gt;SetFont('GB', '', 8); $pdf-&gt;SetLeftMargin(15.0); $pdf-&gt;Image("$user_pkc",15,10,56,56); $pdf-&gt;Cell(56, 56, iconv("UTF-8", "gbk", ""), 1, 0, 'C'); $pdf-&gt;Cell(52, 9.3, iconv("UTF-8", "gbk", "姓名")...

    php GB2312转Big5

    PHP作为一种广泛使用的服务器端脚本语言,经常需要处理各种字符集之间的转换问题,例如"GB2312"到"Big5"的转换。GB2312是中国大陆广泛采用的一种简体中文字符集,而Big5则是主要在台湾和香港地区使用的繁体中文编码...

    UTF-8_GB2312-Src

    本文将深入探讨两个常见的中文字符编码——UTF-8和GB2312,并以三星手机电话本为例,介绍如何进行这两者之间的转换,以便于数据的读取和导入。 首先,我们来理解UTF-8和GB2312的基本概念。UTF-8,全称Unicode ...

    apr-iconv-0.9.7-win32-src-r2.zip_APR iconv_apr-iconv-0.9.7_openg

    标题中的"apr-iconv-0.9.7-win32-src-r2.zip"是指一个针对Windows平台的开源软件包,包含APR Iconv库的源代码版本0.9.7。APR全称为Apache Portable Runtime,是Apache HTTP服务器项目的一个核心部分,提供了跨平台的...

    iconv 跨平台编码转换库

    iconv是知名的开源跨平台编码转换库,iconv.exe是iconv库在windows下的命令行工具,iconv.exe的一般用法:iconv.exe -f gbk -t utf-8 gbk.txt &gt; utf-8.txt。其中 -f gbk 指明转换前的文件编码是gbk,-t utf-8 指明...

    创建图表的PHP类库

     $Test-&gt;draw$graph-&gt;title-&gt;Set(iconv_arr("Phpwind 图表测试")); // 设置图表标题 这里iconv_arr是我自己加的,为了支持我们伟大的中文要把你的当前编码转化为html实体$graph-&gt;xaxis-&gt;title-&gt;Set(iconv_arr("这个...

    创建图表的PHP类库.zip

    //设置X轴标题$graph-&gt;yaxis-&gt;title-&gt;Set(iconv_arr("这个是Y轴")); //设置Y轴标题$graph-&gt;title-&gt;SetFont(FF_SIMSUN,FS_BOLD); //设置标题字体,这里字体默认是FF_FONT1,为了中文换成FF_SIMSUN$graph-&gt;yaxis-&gt;...

    PHP之JPgraph横坐标中文乱码问题

    5. **设置图表标题**:使用`iconv()`函数将中文标题转换为GB2312编码。 6. **处理横坐标数据**:对于横坐标上的每一个中文标签,都使用`iconv()`函数将其从UTF-8转换为GB2312编码。例如: ```php $datas[$i] = ...

    libiconv vc++ 6.0 实例代码 包含 动态dll 静态lib

    项目里#include&lt;iconv.h&gt;,并在工程-&gt;设置-&gt;link里 对象/模块里加入 libiconv.lib c/C++里预定义加入LIBICONV_STATIC Link忽略库加入LIBCD.lib(看似乎有函数重定义的错误,如果有则加入) libiconv使用动态dll 上lib...

Global site tag (gtag.js) - Google Analytics