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

iconv库函数的学习程序

阅读更多
以前用php的iconv函数,使用起来很简单。
用C来写的时候,发现要完全理解了iconv接口才能好程序。
一点不直观。也许是因为性能问题吧,它没有封装一个简单的接口。
对于懒惰的程序员,还是提供一些简单的接口比较好。
因为我们大部分的程序不考虑性能。

我现在不是在写D程序,完全是在写DC程序。
即要考虑C怎么写,又要考虑D怎么用。

附件包括:
  学习例程,和libiconv库

编译方法:
  文件中有一个make.brf文件, 用  bud @make  编译

  需要用到iconv库,请从 http://www.gnu.org/software/libiconv/ 下载
  我编译的时候用的是iconv-1.11版本,dmd-1.020 linux系统

/**
 * iconv 转换库的学习程序
 * Edit by Liu Dehong @ 2007/08/11
 *
 * 参考了libiconv接口
 * 本程序的错误处理设计不好,只是个例子。
 * 完全没有处理常见的错误: 非法字符,内存空间
 * 因为有字符串的复制,性能消耗比较大,考虑完全用D语言改写iconv库,
 * 而不是做封装
 *
 */


/**
* 
* 
* 提供跟 GNU libiconv 库的接口
*
* Name:         libiconvD
* Purpose:      方便在D语言里实现国际编码之间的转换
*
* Author:       张雪平(heromyth)
* Email:        zxpmyth@yahoo.com.cn
* Date:         2007-6-14
* Version:      1.0.1
* Copyrights:   (c) Public Domain and BitWorld Inc.
* Licence:      BSD licence
* 
* Plan:         实现方便在D语言里直接使用的函数或者类
* 
**/

module libiconvD;

alias libiconv iconv ;  ///
alias libiconv_open iconv_open ;  ///
alias libiconv_close iconv_close ; ///


typedef void* iconv_t;

/**
* 设置要转换的编码,并为转换操作准备空间
* 
* Params:
*   fromcode = 需要被转换的源数据的编码格式
*   tocode   = 需要转换成的目标数据的编码格式
* 
* Returns:
*   (iconv_t)(-1),如果设置有错误;<br>
*   新分配的转换描述信息器,如果设置成功。
* 
* See_Also:
*   iconv_open.3.html
* 
* 注意:
*   参数的顺序一下不能错,否则会造成后面的转换失败
*   所有支持编码可以在参考里找到
*
*/
extern (C) iconv_t libiconv_open (char *tocode, char *fromcode);


/**
* 转换核心函数
* 
* Params:
*   cd             = 转换描述信息器,由libiconv_open提供,可存放转换过程状态
*   inbuf          = 指向源字符序列的第一个位置;在执行后,指向新的空间地址:*inbuf + *inbytesleft
*   inbytesleft    = 源字符序列的字节数;在执行后,通常为0,否则为剩余未被转换的字符数
*   outbuf         = 指向存放目标字符序列的首地址;在执行后,指向新的空间地址:*outbuf + 实际转换的字节数
*   outbytesleft   = 存放目标字符序列的总的空间字节数;剩余的目标空间字节数
* 
* Returns:
*   (iconv_t)(-1) 如果转换有问题;<br>
*   0,调用过程中没有使用可逆转换;<br>
*   其它正数,在一次调用过程中以非可逆方式进行转换的字符数
* 
* 注意:
*   对各个参数含义的理解一定要正确,否则很难正确使用这个函数
*
*/
extern (C) size_t libiconv (iconv_t cd, char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);


/**
* 释放先前申请的准备空间
* 
* Params:
*   cd = 指向先前由libiconv_open申请的转换描述信息器空间
*
*/
extern (C) int libiconv_close (iconv_t cd);

import std.stdio;
import std.c.string;
import std.string;
import std.c.stdlib;

char[] utf8_to_gb2312(char[] str)
{
    return code_conver("utf-8", "gb2312", str);
}

char[] gb2312_to_utf8(char[] str)
{
    return code_conver("gb2312", "utf-8", str);
}

char[] code_conver(string from, string to, in char[] in_str)
{
    auto cd = iconv_open(toStringz(to), toStringz(from));
    if (cd == cast(iconv_t)-1)
    {
        throw new Error("Can't Open from " ~ from ~ " to " ~ to);
        writefln("aaaa");
    }

	uint in_len = in_str.length;
	auto inp = toStringz(in_str);

	uint out_len = 2 * in_len;   // may be enough
	char* outp = cast(char*) malloc(out_len * char.sizeof);
    auto old_outp = outp;

    debug (1) {
    writefln("in_str.ptr: %s", in_str.ptr);
    writefln("inp: %s", inp);
    writefln("oup: %s", outp);
    }

    auto old_in_len = in_len;
    auto old_out_len = out_len;
    auto i = iconv(cd, &inp, &in_len, &outp, &out_len);
    auto conv_len = old_out_len - out_len;

	iconv_close(cd);

    debug (1) {
    writefln("i: %s", i);
    writefln("inp: %s", inp);
    writefln("oup: %s", outp);
    writefln("in_len: %s", in_len);
    writefln("out_len %s", out_len);
    }

    debug (1) {
    //printf("%s", inp);
    printf("inp: %s"\n, inp - old_in_len);
    printf("outp: %s"\n, outp - conv_len);
    }

    auto ret = toString(old_outp).dup;
    free(old_outp);

    return ret;
}

void main()
{

    try
    {
        auto str1 = utf8_to_gb2312("aabb我bb");
        printf("return: %.*s"\n, str1);

        auto str2 = gb2312_to_utf8(str1);
        printf("return: %.*s"\n, str2);
    }
    catch (Error err)
    {
        writefln("catch error: %s", err);
    }

    return ;
}

  • d_iconv.zip (515.1 KB)
  • 描述: 学习例程,和libiconv库
  • 下载次数: 37
分享到:
评论

相关推荐

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

    通过iconv库函数,对中文编码进行转换

    本人编译的iconv.so 与其头文件

    我在做一个加密芯片项目...1.如要iconv_open、iconv_close这样的名字,需在iconv.h中加入#define LIBICONV_PLUG即可。 2.如要libiconv_open、libiconv_close这样的名字,需在iconv.h中移除#define LIBICONV_PLUG即可。

    iconv的Windows版

    iconv是文件编码格式转换工具。 提供的iconv.exe是iconv的Windows版。

    几种编码的相互转换

    用C语言的方式进行特殊字符转义 / GB2312/UTF-8 或 ISO-8859-1/UTF-8 之间的互转.iconv库函数的调用

    iconv.iconv.dll

    iconv.

    iconv windows版本 移植 库

    如果需要将Linux版本中用到iconv函数的程序移植到windows上,那么使用这个库是最方便。几乎不用更改代码,只取简单地配置一下即可编译运行。 包含dll, lib, demo程序。

    windows下的iconv静态库

    windows下可使用的iconv静态库,只需引入iconv.h,iconv.lib即可,使用方法见示例文件。

    iconv.h iconv.lib charset.lib

    iconv.h iconv.lib charset.lib 编译时缺少文件时可以用

    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 指明...

    windows字符编码转换库(iconv.dll)32位和64位

    iconv库32位版和64位版都含有,其中包含编译好的: charset.lib、iconv.lib、iconv.dll、charset.dll、iconv.exe 以及头文件:iconv.h、libcharset.h、localcharset.h 还有说明:iconv.1.html、iconv.3.html 等资源

    win编码转换_iconv.h

    在Linux下有个iconv.h头文件,里面是对编码转换处理的封装。但在windows下是没有这个头文件的。这里有三个文件,高手编写,用在windows下:iconv.h,iconv.dll和iconv.lib,导出库,就可以用iconv.h了。用法与Linux下...

    iconv_open出错.txt

    iconv_open("utf-8", "gb2312") 调用失败

    ICONV转码库静态编译

    使用最新的1.15版本代码编译的iconv静态库。使用MinGW 4.9.2编译器,Codeblocks创建工程,带示例,示例为UTF8转SHIFT-JIS编码,静态库经测试可用,目前尚未发现异常。

    iconv编码转码工具

    iconv编码转码工具

    cocos2d-x c++的iconv.rar

    extern size_t iconv (iconv_t cd, @ICONV_CONST@ char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); /* Frees resources allocated for conversion descriptor ‘cd’. */ #ifndef ...

    iconv VS2008移植工程

    iconv_ret = iconv(cd,pin,&inlen,pout,&outlen); if (iconv_ret == (size_t)-1) { perror("iconv():"); exit(0); } iconv_close(cd); return 0; } int u2g(char *inbuf,int inlen,char *outbuf,int ...

    iconv封装后的cpp接口,含iconv的lib、dll、h文件

    iconv封装后的cpp接口,含iconv的lib、dll、h文件。 iconv封装后的cpp接口,含iconv的lib、dll、h文件。

Global site tag (gtag.js) - Google Analytics