关闭

libicon的简单应用

435人阅读 评论(0) 收藏 举报
分类:

原文链接:http://baike.baidu.com/link?url=TwbqVQ-mSECLsUeo2V_IQsZqZfvE-Zbfk0QoCNi1Sz-dHmuHzwny4J0gZ0DV48yAocXYrRc1p3UrqjOWJaA5CK
在Unicode和其他的传统编码之间转换的需求,GNU的libiconv就是为这种应用设计的编码转换库
(1)打开:iconv_t converter = iconv_open("gbk","utf-8");
(2)转换:size_t rc = iconv(converter, input, insize, output, outsize);
(3)关闭:iconv_close(converter);
函数参数:
(iconv_t cd, const char* * inbuf, size_t * inbytesleft, char* * outbuf, size_t * outbytesleft);
  需要注意的是iconv 函数会修改指针*inbuf 和指针*outbuf的值(刚开始不知道,老是内存泄漏)(*inbytesleft,*outbytesleft也会被修改)。因此需要保存原输入、输出内存分配的地址值。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//要转换至的编码应与编译器使用的默认编码不同,相同的话将转换失败
//比如VC6.0中文默认使用<a target="_blank" href="/subview/25412/25412.htm" data-lemmaid="481798">UTF-8</a>进行编码,iconv_open("gbk","UTF-8");将失败
#include <iostream>
#include <iconv.h>
using namespace std;
#pragma comment(lib,"iconv.lib")
int main()
{    
    iconv_t conveter = iconv_open("gbk","UTF-8");
    if(conveter== iconv_t(-1)){
        cout<<"encode convert not supported!"<<<a target="_blank"href="/subview/3892069/3892069.htm"data-lemmaid="6256824">endl</a>;
        if(<a target="_blank"href="/subview/3485007/3485007.htm"data-lemmaid="11040395">errno</a>==EINVAL)cout<<"einval"<<endl;    
        return -1;    
    }
    else{
        cout<<"ok!"<<<a target="_blank"href="/subview/3892069/3892069.htm"data-lemmaid="6256824">endl</a>;    
    }
     
    //待转换的字符串
    size_t insize;
    const char *input = "hello是";//汉字随便加//应是const char *而不是char *
    //char *input_old = <a target="_blank" href="/subview/549540/20270399.htm" data-lemmaid="9795343">input</a>; //记录待转换字符串的地址
    //input_old is unused variable.
    insize=<a target="_blank"href="/subview/736226/5092487.htm"data-lemmaid="3103907">strlen</a>(input);
    cout<<"input is: "<<input<<<a target="_blank"href="/subview/3892069/3892069.htm"data-lemmaid="6256824">endl</a>;
     
    //存储转换结果的字符串
    size_t outsize = insize * 3+1;
    char *output = new char[outsize];
    char *output_old = output;//记录转换后的字符串的地址
    <a target="_blank"href="/subview/982208/982208.htm"data-lemmaid="4747579">memset</a>(output,0,outsize);         
     
    //转换
    //size_t rc = <a target="_blank" href="/subview/1437030/1437030.htm" data-lemmaid="524310">iconv</a>(conveter,(const char **)&<a target="_blank" href="/subview/549540/20270399.htm" data-lemmaid="9795343">input</a>,&insize,&output_old,&outsize);
    //参数要求char **不是const char **。可能存在版本问题。
    size_t ret = <a target="_blank"href="/subview/1437030/1437030.htm"data-lemmaid="524310">iconv</a>(converter,(char**)&input,&insize,&output_old,&outsize);
    //if(rc==-1){
    //size_t 是<a target="_blank" href="/subview/2067328/2067328.htm" data-lemmaid="8604216">unsigned</a>类型
    if(ret==(<a target="_blank"href="/subview/3236587/3236587.htm"data-lemmaid="8101179">size_t</a>)-1)
        cout<<"converting failed"<<<a target="_blank"href="/subview/3892069/3892069.htm"data-lemmaid="6256824">endl</a>;
        return -1;
    }
     
    //输出转换后的字符串
    //cout<<"outputis: "<<output_old;
    //output_old已经被改变了。应使用output来输出结果。
    cout<<"output is : "<<coutput;
    cout<<"  outsize="<<outsize<<<a target="_blank"href="/subview/3892069/3892069.htm"data-lemmaid="6256824">endl</a>;
     
    //delete[] input_old;//<a target="_blank" href="/subview/2537857/2537857.htm" data-lemmaid="6710865">内存释放</a>,不需要释放它,<a target="_blank" href="/subview/346799/6926102.htm" data-lemmaid="9513687">常量</a>字符串
    //delete[] output_old; //内存释放
    //应释放的位置不是output_old,理由同上。
    delete[] output;
    iconv_close(conveter);
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:215235次
    • 积分:4445
    • 等级:
    • 排名:第7581名
    • 原创:214篇
    • 转载:163篇
    • 译文:0篇
    • 评论:60条
    最新评论