libc库中可用于代码转换的iconv()函数如下:
iconv_open()
代码转换分配功能
代码转换功能
iconv_close()
代码转换取消分配功能
iconvctl()
控制和查询代码转换行为
iconvstr()
基于字符串的代码转换功能
The
iconv函数将一个字符或一系列字符从一个代码集转换为另一代码集. iconv_open()函数支持各种代码集. 您可以通过运行以下命令来显示有关系统上当前可用的受支持代码集及其别名的信息:
$ iconv -l
由于iconv模块分为多个软件包,因此可以通过安装其他软件包来扩展可用转换的默认列表. 默认安装包括system / library / iconv / utf-8软件包,其中包含基本的iconv模块集,可以在UTF-8,Unicode和其他选定的代码集之间转换.
您可以使用“程序包管理器”应用程序或pkg命令来安装其他程序包. 如果使用软件包管理器进行安装,则“系统/国际化”类别中将提供其他软件包. 如果使用pkg命令,请使用系统/库/ iconv / *名称模式进行安装.
iconv转换模块的格式为fromcode%tocode.so,并且必须存在于/ usr / lib / iconv目录中的iconv模块库中,iconv函数才能使用它们. 因此,您不能在iconv -l命令列出的任何两个代码集之间进行转换. 当所有iconv软件包都已安装且所需的模块不可用时,可以使用Unicode编码(例如UTF-32)作为中间代码集来执行两步转换. 或者,您可以开发自定义转换模块. 要创建自定义iconv转换模块,请使用geniconvtbl实用程序. 有关geniconvtbl实用程序的输入文件格式的信息,请参见geniconvtbl(4)手册页.
示例2-9使用iconv_open()创建转换描述符
以下代码段显示了如何使用iconv_open()函数将字符串złoty(波兰货币)从单字节ISO 8859-2代码集转换为UTF-8. 要使用iconv函数执行转换,您需要创建一个转换描述符并调用iconv_open()函数,并验证此调用是否成功.
#include
#include
iconv_t cd;
:
cd = iconv_open("UTF-8", "ISO8859-2");
if (cd == (iconv_t)-1) {
(void) fprintf(stderr, "iconv_open() failed");
return(1);
}
目标代码集是iconv_open()函数的第一个参数.
示例2-10使用iconv()进行转换
以下代码段说明了如何使用iconv()函数将一个代码集转换为另一代码集.
在实际转换之前iconv函数库,需要准备一些变量来保存iconv调用返回的信息,例如输出缓冲区iconv函数库,输入和输出缓冲区中剩余的字节数等等.
在ISO 8859-2代码集中,L WITH STROKE字符以十六进制表示为0xB3. 因此,将保存输入字符串的输入缓冲区(inbuf)设置为z \ xB3oty. inbuf的内容将是读取流或文件的结果.
#include
#include
#include
:
int ret;
char *inbuf;
size_t inbytesleft, outbytesleft;
char outbuf[BUFSIZ];
char *outbuf_p;
inbuf = "z\xB3oty";
inbytesleft = 5; /* the size of the input string */
输出缓冲区至少需要6个字节才能保存转换后的字符串. 可以将L WITH STROKE字符转换为Unicode字符拉丁小写字母L WITH STROKE,可以将其表示为UTF-8中的双字节序列0xC5 0x82.
由于在大多数情况下,转换前生成的字符串的实际大小是未知的,因此请确保为输出缓冲区分配足够的额外空间. 在这种情况下,在stdio.h中定义BUFSIZ宏就足够了.
outbytesleft = BUFSIZ;
outbuf_p = outbuf;
此转换调用使用上一个示例中的转换描述符cd.
ret = iconv(cd, &inbuf, &inbytesleft, &outbuf_p, &outbytesleft);
在调用iconv之后,您需要检查此调用是否成功. 如果调用成功,但输出缓冲区中仍有空间,则需要以空字符终止字符串.
if (ret != (size_t)-1) {
if (outbytesleft == 0) {
/* Cannot terminate outbuf as a character string; error return */
return (-1);
}
/* success */
*outbuf_p = '\0';
:
}
如果调用成功,则outbuf将在UTF-8代码集中\ x7a \ xc5 \ x82 \ x6f \ x74 \ x79或z \ xc5 \ x82oty中包含此字符串的十六进制表示. 现在,inbuf将指向转换后的字符串的末尾. inbytesleft将为0. outbytesleft将减少6,该数字是放入输出缓冲区的字节数. outbuf_p将指向outbuf中输出字符串的末尾.
如果调用失败,请检查errno值以处理错误情况,如以下代码片段所示:
if (ret != (size_t)-1)) {
if (errno == EILSEQ) {
/* Input conversion stopped due to an input byte that
* does not belong to the input codeset.
*/
:
} else if (errno == E2BIG) {
/* Input conversion stopped due to lack of space in
* the output buffer.
*/
:
} else if (errno == EINVAL) {
/* Input conversion stopped due to an incomplete
* character or shift sequence at the end of the
* input buffer.
*/
:
}
}
最后,取消分配转换描述符及其所有关联的内存.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-228192-1.html