以前用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 ;
}
分享到:
相关推荐
iconv是一个命令行工具,同时也提供了库函数接口供开发者在程序中调用。它的工作原理是将输入的字符串从一种字符编码(如GBK)转换为另一种字符编码(如UTF-8),确保文本在不同平台和系统间正确无误地传输。 2. *...
1. **Iconv函数简介**:Iconv函数是Unix/Linux系统下用于字符集转换的库函数,它提供了将一种编码格式的数据转换为另一种编码格式的功能。 2. **动态库调用与编译选项**:在动态库中调用Iconv函数时,需要在编译时...
以上只是Linux C库函数的一小部分,实际上还有更多针对特定任务的库,如regex.h用于正则表达式匹配,dlfcn.h用于动态链接,iconv.h用于字符集转换等。掌握这些库函数的使用,能够帮助开发者更高效地编写健壮、高效的...
在Windows上,静态链接库是将库函数直接编译进目标代码的一种方式,这意味着在运行时不需要独立的库文件。开发者可以将libIconv.lib链接到自己的项目中,以便调用libIconv的转换功能。 **iconv.h**是libIconv的...
iconv命令是用来转换文件的编码方式,比如它可以将UTF8编码的转换成GB18030的编码...Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C++函数(非标准库函数),可以用来在C/C++程序中很方便的转换字符编码。
学习这样的程序可以加深对字符编码的理解,以及如何在C++中实现字符转换的算法。 在C/C++编程中,进行字符编码转换通常涉及到对原始字符串的解码和重新编码过程。例如,可以使用标准库中的`iconv`函数或者自定义...
在实现这种转换时,你需要理解两种编码的字节顺序和结构,并且可能需要使用到一些库函数,例如`WideCharToMultiByte`和`MultiByteToWideChar`在Windows平台上,或者使用`iconv`在跨平台环境下。 转换过程通常包括...
更安全的做法是使用`iconv()`这样的转换函数,或者使用支持Unicode的库,如GNU的libiconv或ICU(International Components for Unicode)。 此外,当涉及到用户界面或者命令行参数时,可能需要处理终端的编码设置。...
本资源“C语言标准库源码大全”包含的是C语言标准库的源代码,对于学习C语言、深入理解其内部机制以及提升编程技能来说非常有价值。 首先,我们要明白C语言标准库是由ISO/IEC 9899定义的,主要由头文件和对应的实现...
这可能涉及蓝牙、Wi-Fi或者通过特定的罗兰应用程序实现无线同步,让手机或平板电脑成为增强学习体验的一部分。 版本说明.txt是软件的版本信息文件,列出了当前版本的详细改动、更新内容和可能的修复问题,帮助用户...
在IT领域,编码之间的转换是一项基础且重要的任务,特别是在处理多语言、跨...无论是使用`iconv`命令行工具,还是编程语言中的库函数,都需要理解各种编码的特性和转换原理,以便在实际工作中灵活应对各种编码挑战。
- **iconv函数**:是一个用于字符编码转换的库函数,支持多种编码之间的转换。 ### C++关键字 C++标准定义了一组关键字,如int、class、return等,它们在语言中具有特殊的意义。在学习C++时,了解这些关键字及其...
在CC++中,理解并掌握不同的字符编码,如UTF-8、GB2312、GBK以及Big5,对于编写跨平台和兼容多语言的程序至关重要。本文将深入探讨这些编码标准,并提供在CC++中进行转换的方法。 首先,UTF-8是最广泛使用的Unicode...
例如,你可以创建一个`iconv_t`句柄,然后通过`iconv_open`打开一个转换描述符,接着使用`iconv`函数进行实际的转换工作,最后通过`iconv_close`关闭句柄。在处理多字节字符集(如GBK)和宽字符集(如UTF-16)时,要...
动态链接库文件(`.dll`)和静态链接库文件(`.lib`)是实现这些功能的关键组成部分,确保了程序在运行时能够调用所需的库函数。在部署和使用依赖于APR的应用时,必须确保这些库文件的可用性和正确配置。
但在跨平台的项目中,我们可能需要使用像`iconv`这样的库,或者在C++11及其以后版本中,可以利用`std::wstring_convert`和`std::codecvt_utf8_utf16`来实现转换。 以下是一个简单的示例,展示了如何使用C++11的`std...
使用libiconv库时,通常会调用其提供的API函数,如`iconv_open()`来创建一个新的转换描述符,`iconv()`来进行实际的字符转换,以及`iconv_close()`来释放资源。这些函数允许开发者在程序中灵活地控制字符集转换的...