zoukankan      html  css  js  c++  java
  • GNU-libiconv编码转换库的使用举例

    继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 ",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! Input IRS Metadata path = %s ",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;
    }

  • 相关阅读:
    IDEA开发常用快捷键
    常见操作系统的分类
    预科班第四次考核总结
    博客园使用office 365写博客
    大三上学期十二周总结
    python循环和布尔表达式总结
    灵活运用绑定变量---declare匿名块使用绑定变量
    Oracle 10G强大的SQL优化工具:SQL Tuning Advisor
    40个DBA日常维护的SQL脚本--1113
    awr相关指标解析
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7190152.html
Copyright © 2011-2022 走看看