继GDAL库、PROJ库、HDF5库、TINYXML库之后,手上进行的项目又让我碰到了ICONV库。之前花了2天时间没有搞定,在甲方一直催促下,今天又捡起来搞搞,搞了一天最终搞定了。相关心得记录例如以下:

ICONV库的主要作用是进行各个国家不同编码方式之间的转换。

仅仅要支持的有:Unicode[utf8、utf16等]、中国标准[GBK、GB18030、BIG5、EUC-CN等]、欧洲标准[ASCLL、CP、Mac等]。我这个项目中涉及到的就是utf8与GBK之间的转换。

早期的ICONV库是同一时候公布LINUX和WINDOWS的版本号的,在1.11版本号之后不再对WINDOWS进行支持,眼下最新的版本号为2011年公布的1.14。

第一步:

在linux以下编译的命令非常easy:

@./configure

@make

@make install

三条命令运行完毕之后在/usr/local/include以下会出现三个.h文件。

在/usr/local/lib以下会出现11个文件(.a及其.so)。

第二步:

在编写转换程序之前有必要先看看系统的编码方式是什么。命令为@locale。

LANG=en_US.UTF-8

LC_CTYPE="POSIX"

LC_NUMERIC="POSIX"

LC_TIME="POSIX"

LC_COLLATE="POSIX"

LC_MONETARY="POSIX "

LC_MESSAGES="POSIX "

LC_PAPER="POSIX "

LC_NAME="POSIX "

LC_ADDRESS="POSIX"

LC_TELEPHONE="POSIX "

LC_MEASUREMENT="POSIX "

LC_IDENTIFICATION="POSIX "

LC_ALL="POSIX "

上面的信息显示当前系统的编码方式为UTF8,为了与甲方server一致。改动成GBK。

@vi /etc/profile

在末尾加入2行:

export LC_ALL="zh_CN.GBK"

export LANG="zh_CN.GBK"

@reboot

@locale

LANG=zh_CN.GBK

LC_CTYPE="zh_CN.GBK

LC_NUMERIC="zh_CN.GBK "

LC_TIME="zh_CN.GBK "

LC_COLLATE="zh_CN.GBK

LC_MONETARY="zh_CN.GBK "

LC_MESSAGES="zh_CN.GBK "

LC_PAPER="zh_CN.GBK "

LC_NAME="zh_CN.GBK "

LC_ADDRESS="zh_CN.GBK "

LC_TELEPHONE="zh_CN.GBK "

LC_MEASUREMENT="zh_CN.GBK "

LC_IDENTIFICATION="zh_CN.GBK "

LC_ALL=zh_CN.GBK

上面的信息表明系统的编码方式已经改动成功。

第三步:

设置链接库的环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

第四步:

在cpp文件里包括头文件

#include <iconv.h>

第五步:

编写转换函数

bool ChangeCodeToGBK(char* szInstr,int in,char* szOutstr,int out)

{

 iconv_t conveter=iconv_open("GBK","UTF-8");

//iconv_open函数第一个參数为ToEncoding。第二个參数为FromEncoding

 memset(szOutstr,0,out);

 char **source=&szInstr;

 char **dest=&szOutstr;

 

 iconv(conveter,(char **)source,(size_t *)&in,(char **)dest,(size_t *)&out);

 iconv_close(conveter);

return 0;

}

bool ChangeCodeToUTF8(char* szInstr,int in,char* szOutstr,int out)

{

 iconv_t conveter=iconv_open("UTF-8","GBK");

 memset(szOutstr,0,out);

 char **source=&szInstr;

 char **dest=&szOutstr;

 

 iconv(conveter,(char **)source,(size_t *)&in,(char **)dest,(size_t *)&out);

 iconv_close(conveter);

return 0;

}

第六步:

主函数调用示范

const char * pathMetaData = NULL;

//读取UTF8格式的字符串。存入pathMetaData数组中。

printf("Input IRS Metadata path = %s \n\n",pathMetaData);

char strcopy[256];

 memset(strcopy,0,256);

 char szgbk[256];

 memset(szgbk,0,256);

 

 strcpy(strcopy,pathMetaData);

 ChangeCodeToGBK(strcopy,strlen(strcopy),szgbk,256);

 strcpy(const_cast<char*>(pathMetaData),szgbk);

 printf("Encoding changed!\nInput IRS Metadata path = %s \n\n",pathMetaData);

第七步:

加入一个推断函数IsTextUTF8( char *lpstrInputStream, int iLen )

bool IsTextUTF8( char *lpstrInputStream, int iLen )

{

 int   i;

 unsigned long cOctets;   // octets to go in this UTF-8 encoded character

 unsigned char chr;

 bool   bAllAscii= true;

cOctets= 0;

 for( i=0; i < iLen; i++ ) 

 {

  chr= *(lpstrInputStream+i);

  if( (chr&0x80) != 0 ) bAllAscii= false;

  if( cOctets == 0 )   

  {

   // 7 bit ascii after 7 bit ascii is just fine.   Handle start of encoding case.

   if( chr >= 0x80 ) 

   {  

    // count of the leading 1 bits is the number of characters encoded

    do 

    {

     chr <<= 1;

     cOctets++;

    }

    while( (chr&0x80) != 0 );

    cOctets--;       // count includes this character

    if( cOctets == 0 ) return false; // must start with 11xxxxxx

   }

  }

  else 

  {

   // non-leading bytes must start as 10xxxxxx

   if( (chr&0xC0) != 0x80 ) 

   {

    return false;

   }

   cOctets--;                   // processed another octet in encoding

  }

 }

// End of text.   Check for consistency.

 if( cOctets > 0 ) // anything left over at the end is an error

 {   

  return false;

 }

if( bAllAscii )  // Not utf-8 if all ascii.   Forces caller to use code pages for conversion

 {     

  return false;

 }

 return true;

}

GNU-libiconv编码转换库的使用举例的更多相关文章

  1. libiconv字符集转换库在C#中的使用

    <libiconv字符集转换库用法>一文中说到了libiconv能够实现不同字符集的转换. 比方GBK转BIG5等.在项目中由于须要,找到这个库.但是这个库在C#中没有非常好的支持.只是, ...

  2. PHP字符编码转换库iconv的一个细节

    先来看代码 <?php $charset = 'GBK'; $str = '中华人民共和国中华人民共和国中华人民共和国中华人民共和国'; ; $str2 = iconv('UTF-8', $ch ...

  3. iconv字符编码转换

    转自 http://blog.csdn.net/langresser_king/article/details/7459367 iconv(http://www.gnu.org/software/li ...

  4. [NodeJS] Node.js 编码转换

    Node.js 自带的 toString() 方法不支持 gbk,因此中文转换的时候需要加载第三方库,推荐以下两个编码转换库,iconv-lite 和 encoding. iconv, iconv-l ...

  5. Node.js 编码转换

    Node.js自带的toString()方法不支持gbk,因此中文转换的时候需要加载第三方库,推荐以下两个编码转换库,iconv-lite和encoding.       iconv, iconv-l ...

  6. erlang中字符编码转换(转)

    转自:http://www.thinksaas.cn/group/topic/244329/ 功能说明: erlang中对各种语言的编码支持不足,此代码是使用erlang驱动了著名的iconv编码库来 ...

  7. 关于JS的编码转换问题

    在进行JS开发过程中,尤其是在开发报表时,报表已集成到Web页面中,通过在页面传递参数至报表中时,会发现有时某些参数值,传递到报表中是显示为问号或乱码等等一系列不能正常显示的情况. 这是由于浏览器和报 ...

  8. golang编码转换

    在网上搜索golang编码转化时,我们经常看到的文章是使用下面一些第三方库: https://github.com/djimenez/iconv-go https://github.com/qiniu ...

  9. 理解perl的编码转换——utf8以及乱码

    工作需要,闲暇之余,仔细研究了一下脚本乱码的问题 1. vim新建的文件 1)在linux命令行 vim命令建立的文件,如果内容中不出现中文,默认是ASCII.那么用notepad++打开的时候,就是 ...

随机推荐

  1. struts2解决动态多文件上传的问题(上传文件与数据库字段一一对应)(转)

    struts2多文件上传我想只要会用struts2的朋友都不会陌生,但是怎么在action中根据用户上传的文 件把文件路径写到数据库中对应的字段上呢?ps:我的意思是这样,页面上有固定的5个上传文件的 ...

  2. 再识Quartz

    在之前的项目中使用过Quartz,但都是基于XML配置定义任务的.目前一个项目应用需要对任务进行创建.暂停.删除等动态管理.所以再次在网上翻了翻,再来好好重新认识下Quartz. 名词解释: sche ...

  3. css表格表单和统筹

    css:表格表单和统筹 学习目标 1.表单标签及属性高级 2.表格标签及属性高级 3.CSS统筹 4.BFC概念和应用场景 一.表单标签及属性高级 回顾: 表单的作用:用来收集用户的信息的; 表单的组 ...

  4. ASP.NET-internat身份验证

    ASP.NET-internat身份验证默认在webconfig中配置的代码是这样的 <system.web> <compilation debug="true" ...

  5. Eclipse配置Maven私服

    Eclipse配置Maven私服 前言: 搭建Maven私有仓库的主要目的,是为了在团队多人开发时,只要内网的私有仓库有下载过依赖的jar包,就直接从私有仓库获取,不再通过外网的中央仓库.如果私服上面 ...

  6. Android Java 程序员必备开发工具

    对于Java,有两种截然不同的观点:一种认为Java是最简单功能最强大的编程语言之一,另一种则表示这种编程语言既难用又复杂. 下面这些工具或许功能和作用不同,但是有着一个共同的主旨,那就是——它们都是 ...

  7. 跟我学设计模式视频教程——适配器模式,适配器模式VS装饰模式

    课程视频 适配器模式 适配器模式VS装饰模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍

  8. 前端project师养成记:开发环境搭建(Sublime Text必备插件推荐)

    为了让自己更像一个前端project师,决定从开发环境開始武装自己. 本文将介绍前段project师开发的一些利器的安装步骤,主要包含了: 1.Node.js的安装 2.Grunt的安装及经常使用插件 ...

  9. hibernate配置数据库连接池三种用法

    三种连接都是以连接MySQl为例. <!-- JDBC驱动程序 --> <property name="connection.driver_class">o ...

  10. Codeforces Round #311 (Div. 2)题解

    A. Ilya and Diplomas time limit per test 1 second memory limit per test 256 megabytes input standard ...