libiconv_百度百科

  由于历史原因,国际化的文字常常由于语言或者国家的原因使用不同的编码。
目录

    1libiconv历史简介

    2libiconv编码简介

    3libiconv使用举例
    ▪使用步骤
    ▪函数参数:

1libiconv历史简介编辑
随着互联网时代的到来,通过互联网进行文字交流也逐渐增多:浏览外国的网站,这个时候字符编码的转换变得尤为重要。这带来了一个问题,就是许多字符在某一种编码方式中没有。为了解决这种混乱,Unicode的编码方式被建立。Unicode是一种超级编码包含了所有这些编码的字符集,因此一些新的文本格式像XML的默认编码方式就是Unicode.
但是很多老式的计算机还在使用当地的传统的字符编码方式。而一些程序,例如邮件程序和浏览器必须能在这些不同的用户编码之间作转换。其他的一些程序则内置支持Unicode,以顺利支持国际化的处理,但是仍然有在Unicode和其他的传统编码之间转换的需求。GNU的libiconv就是为这两种应用设计的编码转换库。
2libiconv编码简介编辑
libiconv库[1]为需要做转换的应用提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换。
包括的编码有:
欧洲语系   
ASCII,
ISO-8859-{1,2,3,4,5,7,9,10,13,14,15,16},
KOI8-R, KOI8-U, KOI8-RU,
CP{1250,1251,1252,1253,1254,1257},
CP{850,866},
Mac{Roman,CentralEurope,Iceland,Croatian,Romania},
Mac{Cyrillic,Ukraine,Greek,Turkish},
Macintosh
犹太语系    ISO-8859-{6,8}, CP{1255,1256}, CP862, Mac{Hebrew,Arabic}
日文    EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP, ISO-2022-JP-2, ISO-2022-JP-1
中文    EUC-CN, HZ, GBK, GB18030, EUC-TW, BIG5, CP950, BIG5-HKSCS, ISO-2022-CN, ISO-2022-CN-EXT
朝鲜文    EUC-KR, CP949, ISO-2022-KR, JOHAB
亚美尼亚语    ARMSCII-8
格鲁尼亚语    Georgian-Academy, Georgian-PS
塔吉克语    KOI8-T
泰国语    TIS-620, CP874, MacThai
老挝语    MuleLao-1, CP1133
越南语    VISCII, TCVN, CP1258
特殊平台    HP-ROMAN8, NEXTSTEP
全部Unicode   
UTF-8, UTF-7
UCS-2, UCS-2BE, UCS-2LE, UCS-4, UCS-4BE, UCS-4LE
UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE
C99, JAVA
全部Unicode,在uint16_t或uint32_t方面(使用机器相关的字节序和对齐方式):
  UCS-2-INTERNAL, UCS-4-INTERNAL
  本地依赖,在'char'或'wchar_t'方面(使用机器相关的字节序和对齐方式,以及系统和区域相关的语义):
  char, wchar_t 
  空的编码名""等同于"char",它表示与区域相关的字符编码
  当使用了--enable-extra-encodings设置选项,将额外提供对少量编码的支持:
欧洲语系
   
CP{437,737,775,852,853,855,857,858,860,861,863,865,869,1125}
犹太语系
   
CP864
日语
   
EUC-JISX0213, Shift_JISX0213, ISO-2022-JP-3
土库曼语
   
TDS565
特殊平台
   
RISCOS-LATIN1
通过将Unicode作为 中间编码,所有编码之间都可以相互转换。
  并且也在直译上提供了有限的支持。就是说,当一个字符在目标的编码里没有的对应字符的时候,转换程序会自动从一个或多个看起来相似的字符中选择一个。目标编码名前面加上“//TRANSLIT”即可使用直译功能。
  libiconv在系统缺少多种多样的字符编码支持时,提供这样方面的支持,
3libiconv使用举例编辑
使用步骤

  (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中文默认使用UTF-8进行编码,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!"<<endl;
        if(errno==EINVAL)cout<<"einval"<<endl;  
        return -1;  
    }
    else{
        cout<<"ok!"<<endl;  
    }
    
    //待转换的字符串
    size_t insize;
    const char *input = "hello是";//汉字随便加//应是const char *而不是char *
    //char *input_old = input; //记录待转换字符串的地址
    //input_old is unused variable.
    insize=strlen(input);
    cout<<"input is: "<<input<<endl;
    
    //存储转换结果的字符串
    size_t outsize = insize * 3+1;
    char *output = new char[outsize];
    char *output_old = output;//记录转换后的字符串的地址
    memset(output,0,outsize);       
    
    //转换
    //size_t rc = iconv(conveter,(const char **)&input,&insize,&output_old,&outsize);
    //参数要求char **不是const char **。可能存在版本问题。
    size_t ret = iconv(converter,(char**)&input,&insize,&output_old,&outsize);
    //if(rc==-1){
    //size_t 是unsigned类型
    if(ret==(size_t)-1)
        cout<<"converting failed"<<endl;
        return -1;
    }
    
    //输出转换后的字符串
    //cout<<"outputis: "<<output_old;
    //output_old已经被改变了。应使用output来输出结果。
    cout<<"output is : "<<coutput;
    cout<<"  outsize="<<outsize<<endl;
    
    //delete[] input_old;//内存释放,不需要释放它,常量字符串
    //delete[] output_old; //内存释放
    //应释放的位置不是output_old,理由同上。
    delete[] output;
    iconv_close(conveter);
}

libiconv_百度百科的更多相关文章

  1. python爬虫—爬取百度百科数据

    爬虫框架:开发平台 centos6.7 根据慕课网爬虫教程编写代码 片区百度百科url,标题,内容 分为4个模块:html_downloader.py 下载器 html_outputer.py 爬取数 ...

  2. [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...

  3. Python3爬取百度百科(配合PHP)

    用PHP写了一个网页,可以获取百度百科词条.源代码已分享至github:https://github.com/1049451037/xiaobaike/tree/master 那么通过Python来爬 ...

  4. redis百度百科和维基百科知识总结:

    1. 百度百科知识总结: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis ...

  5. Apache Mesos_百度百科

    Apache Mesos_百度百科 Apache Mesos

  6. JEFF BANKS_百度百科

    JEFF BANKS_百度百科 JEFF BANKS

  7. RCMTM _百度百科

    RCMTM _百度百科 RCMTM

  8. c31 rotc_百度百科

    c31 rotc_百度百科 c31 rotc

  9. bda_百度百科

    bda_百度百科 bda

随机推荐

  1. Hibernate: merge方法

    在Hibernate中,有save.persist.savaOrUpdate.merge等方法有插入数据的功能.前三者理解起来较后者容易一些,merge方法从api中的介绍就看以看出它是最复杂的.下面 ...

  2. index seek与index scan

    原文地址:http://blog.csdn.net/pumaadamsjack/article/details/6597357 低效Index Scan(索引扫描):就全扫描索引(包括根页,中间页和叶 ...

  3. VC连接SQL server2005

    VC连接SQL server2005 1.创建一个MFC对话框程序 界面如下 2.创建一个成员变量 这个成员变量用于连接数据库 3.响应按钮函数OnButton1() 在响应函数里主要有三个函数 函数 ...

  4. 如何一步步把网站Retina优化

    随着高清屏幕.高分辨率屏幕越来越流行,例如MacBook Retina机型.iPad Air系列,这些新生机器有着很高的PPI,对网页的清晰度要求很高,所以越来越多的站长都不得不面临一个问题,那就是把 ...

  5. Oracle delete input与delete all input

    oracle官方文档提示:If you had specified DELETE INPUT rather than DELETE ALL INPUT, then RMAN would have on ...

  6. C# MySQL数据库的备份 还原 初始化

    // 执行创建数据库操作 this.GetExecute(G_Con, "create database if not exists NEWDB"); this.sqlAddres ...

  7. Sublime Text 3 无法使用package control安装插件解决办法

    Crossing's Blog NOT Genius but Try Best 首页 分类 关于 归档 标签 问题貌似出现在liveStyle版本更新之后,因为打算安装javascript next和 ...

  8. html加载js那些事

    浏览器通过内置的JavaScript引擎,读取网页中的代码,对其处理后运行. JavaScript代码嵌入网页的方法 在网页中嵌入JavaScript代码有多种方法. 直接添加代码块 通过script ...

  9. UIButton, KVC, KVO

    按钮 自定义按钮:调整内部子控件的frame 方式1:实现titleRectForContentRect:和imageRectForContentRect:方法,分别返回titleLabel和imag ...

  10. jQuery 源码分析和使用心得 - 关于源码

    说到jQuery, 大家可能直觉的认为jQuery的源码应该就是一个jquery.xx.js这样的一个文件. 但是看到真正的源码的时候, 整个人都思密达了.jQuery的源码做的事远比你想象的多, 为 ...