`
sofire
  • 浏览: 146175 次
  • 性别: 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 rar 源文件 库文件

    iconv是一个命令行工具,同时也提供了库函数接口供开发者在程序中调用。它的工作原理是将输入的字符串从一种字符编码(如GBK)转换为另一种字符编码(如UTF-8),确保文本在不同平台和系统间正确无误地传输。 2. *...

    Iconv函数进行字符集转换.pdf

    1. **Iconv函数简介**:Iconv函数是Unix/Linux系统下用于字符集转换的库函数,它提供了将一种编码格式的数据转换为另一种编码格式的功能。 2. **动态库调用与编译选项**:在动态库中调用Iconv函数时,需要在编译时...

    Linux C常用库函数手册

    以上只是Linux C库函数的一小部分,实际上还有更多针对特定任务的库,如regex.h用于正则表达式匹配,dlfcn.h用于动态链接,iconv.h用于字符集转换等。掌握这些库函数的使用,能够帮助开发者更高效地编写健壮、高效的...

    libIconv 的VS2010工程

    在Windows上,静态链接库是将库函数直接编译进目标代码的一种方式,这意味着在运行时不需要独立的库文件。开发者可以将libIconv.lib链接到自己的项目中,以便调用libIconv的转换功能。 **iconv.h**是libIconv的...

    libiconv的源码汇总

    iconv命令是用来转换文件的编码方式,比如它可以将UTF8编码的转换成GB18030的编码...Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C++函数(非标准库函数),可以用来在C/C++程序中很方便的转换字符编码。

    VC 繁、简转换程序.rar

    学习这样的程序可以加深对字符编码的理解,以及如何在C++中实现字符转换的算法。 在C/C++编程中,进行字符编码转换通常涉及到对原始字符串的解码和重新编码过程。例如,可以使用标准库中的`iconv`函数或者自定义...

    unicode,gbk编码相互转换C程序

    在实现这种转换时,你需要理解两种编码的字节顺序和结构,并且可能需要使用到一些库函数,例如`WideCharToMultiByte`和`MultiByteToWideChar`在Windows平台上,或者使用`iconv`在跨平台环境下。 转换过程通常包括...

    linux C 学习资料

    更安全的做法是使用`iconv()`这样的转换函数,或者使用支持Unicode的库,如GNU的libiconv或ICU(International Components for Unicode)。 此外,当涉及到用户界面或者命令行参数时,可能需要处理终端的编码设置。...

    c语言标准库源码大全

    本资源“C语言标准库源码大全”包含的是C语言标准库的源代码,对于学习C语言、深入理解其内部机制以及提升编程技能来说非常有价值。 首先,我们要明白C语言标准库是由ISO/IEC 9899定义的,主要由头文件和对应的实现...

    V-Drums Note(Home)_2017_03_17.zip

    这可能涉及蓝牙、Wi-Fi或者通过特定的罗兰应用程序实现无线同步,让手机或平板电脑成为增强学习体验的一部分。 版本说明.txt是软件的版本信息文件,列出了当前版本的详细改动、更新内容和可能的修复问题,帮助用户...

    编码之间的转换

    在IT领域,编码之间的转换是一项基础且重要的任务,特别是在处理多语言、跨...无论是使用`iconv`命令行工具,还是编程语言中的库函数,都需要理解各种编码的特性和转换原理,以便在实际工作中灵活应对各种编码挑战。

    软件基础学习总结

    - **iconv函数**:是一个用于字符编码转换的库函数,支持多种编码之间的转换。 ### C++关键字 C++标准定义了一组关键字,如int、class、return等,它们在语言中具有特殊的意义。在学习C++时,了解这些关键字及其...

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

    在CC++中,理解并掌握不同的字符编码,如UTF-8、GB2312、GBK以及Big5,对于编写跨平台和兼容多语言的程序至关重要。本文将深入探讨这些编码标准,并提供在CC++中进行转换的方法。 首先,UTF-8是最广泛使用的Unicode...

    C 编码格式转换(32位)

    例如,你可以创建一个`iconv_t`句柄,然后通过`iconv_open`打开一个转换描述符,接着使用`iconv`函数进行实际的转换工作,最后通过`iconv_close`关闭句柄。在处理多字节字符集(如GBK)和宽字符集(如UTF-16)时,要...

    apr的动态链接库

    动态链接库文件(`.dll`)和静态链接库文件(`.lib`)是实现这些功能的关键组成部分,确保了程序在运行时能够调用所需的库函数。在部署和使用依赖于APR的应用时,必须确保这些库文件的可用性和正确配置。

    c++ UTF-8 UTF-16转换

    但在跨平台的项目中,我们可能需要使用像`iconv`这样的库,或者在C++11及其以后版本中,可以利用`std::wstring_convert`和`std::codecvt_utf8_utf16`来实现转换。 以下是一个简单的示例,展示了如何使用C++11的`std...

    libiconv lib版本

    使用libiconv库时,通常会调用其提供的API函数,如`iconv_open()`来创建一个新的转换描述符,`iconv()`来进行实际的字符转换,以及`iconv_close()`来释放资源。这些函数允许开发者在程序中灵活地控制字符集转换的...

Global site tag (gtag.js) - Google Analytics