嵌入式 字符编码转换libiconv库

原创 2013年12月02日 14:52:40
当前流行的字符编码格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是专门处理中文编码的。因为在Email时使用中文老出现乱码问题,需要"gb2312"转换成"utf-8"格式,所以,需要使用字符编码转换,而libiconv是一个常用的编码转换库,支持常用的多种编码之间的转换。在Linux下,工具链gcc有专门的libiconv库,所有不用移植,但在arm-linux下就没那么幸运了,需要我们额外移植libiconv库,不过,过程还是比较简单的。

 

一、字符编码转换libiconv库介绍

   libiconv是一个常用的编码转换库,支持常用的多种编码之间的转换。主要函数有:

   #include

   iconv_ticonv_open(constchar *tocode,  const char*fromcode);

   size_ticonv(iconv_tcd,  char **inbuf,  size_t*inbytesleft,  char **outbuf, size_t *outbytesleft);

   int iconv_close(iconv_tcd);

   iconv_open是打开一个编码流,类似于打开一个编码管道(通道),出错则返回-1;

   iconv用于具体输入的转换,如果出错,则返回-1,否则返回 0;

   iconv_close是关闭该管道(通道)。

   如果对于大量需要转换的编码,上述函数covert不适合该方式,一是内存的限制不能一次调用,二是若分多次调用会频繁打开一个编码管道(通道),导致资源浪费,最好的办法还是拆开该函数根据情况使用。   

 

二、arm-linux移植过程

   1)http://www.gnu.org/software/libiconv/下载 libiconv-1.14.tar.gz

   2)./configureCC=arm-hismall-linux-gcc --target=arm-linux--host=arm-hismall-linux--prefix=/usr/local/iconv --enable-shared--enable-static

   3)make   

   4) makeinstall

 

三、实例unicode.cpp

  1. //#include   <stdio.h>
  2. #include   <stdlib.h>
  3. #include   <unsitd.h>
  4. #include "./iconv.h"  
  5. using namespace std;  
  6.   
  7. // 代码转换操作类  
  8. class CodeConverter  
  9. private 
  10.     iconv_t cd;  
  11.       
  12. public 
  13.     // 构造  
  14.     CodeConverter(const char *from_charset, const char *to_charset)   
  15.      
  16.         cd iconv_open(to_charset, from_charset);  
  17.      
  18.   
  19.     // 析构  
  20.     ~CodeConverter()   
  21.      
  22.         iconv_close(cd);  
  23.      
  24.   
  25.     // 转换输出  
  26.     int convert(char *inbuf, int inlen, char *outbuf, int outlen)   
  27.      
  28.         char **pin &inbuf;  
  29.         char **pout &outbuf;  
  30.   
  31.         memset(outbuf, 0, outlen);  
  32.         return iconv(cd, pin, (size_t *)&inlen, pout, (size_t *)&outlen);  
  33.      
  34. };  
  35.   
  36. int main(int argc, char **argv)  
  37.  
  38.     char *gb2312 "我是中国人" 
  39.     char out0[256] {0};  
  40.     char out1[256] {0};  
  41.   
  42.     // gb2312-->utf-8  
  43.     CodeConverter cc0 CodeConverter("gb2312","utf-8");  
  44.     cc0.convert(gb2312, strlen(gb2312)+1, out0, 256);  
  45.     cout << "gb2312-->utf-8 in=" << gb2312 << ",out0=" << out0 << endl;  
  46.   
  47.     // utf-8-->gb2312  
  48.     CodeConverter cc1 CodeConverter("utf-8""gb2312");  
  49.     cc1.convert(out0, strlen(out0)+1, out1, 256);  
  50.     cout << "utf-8-->gb2312 in=" << out0 << ",out1=" << out1 << endl;    
  51.       
  52.     return 0;  
  53.  

   arm-hismall-linux-g++ unicode.cpp-L./-liconv //静态库然后nfs下载到板子上或直接运行就ok了。

相关文章推荐

Netty通信框架Java实现小记

1、Netty介绍    Netty通俗地说就是一套Socket通信框架,提供异步的、事件驱动的网络应用程序框架和工具,可快速开发高性能、高可靠性的网络服务器和客户端程序 2、Netty的特性...

我使用过的Linux命令之iconv - 字符编码转换工具

转自:http://codingstandards.iteye.com/blog/807077 我使用过的Linux命令之iconv - 字符编码转换工具 本文链接:http://...

[C/C++]_[使用libiconv库转换字符编码]

场景: 1.在windows上我们可以通过WideCharToMultiByte和MultiByteToWideChar直接转换或间接转换编码,但是在linux或mac上却没有那么方便的系统api了,...

字符编码转换iconv

  • 2016年08月12日 15:05
  • 637KB
  • 下载

Android NDK 下的宽字符编码转换及icu库的使用

    原贴http://topic.csdn.net/u/20101022/16/1b2e0cec-b9d2-42ea-8d9c-4f1bb8320a54.html?r=70149216 ,看过并动...

字符编码转换工具

  • 2017年07月12日 09:17
  • 349KB
  • 下载

字符编码转换工具

  • 2008年06月14日 14:27
  • 347KB
  • 下载

GNU-libiconv编码转换库的使用举例

继GDAL库、PROJ库、HDF5库、TINYXML库之后,手上进行的项目又让我碰到了ICONV库。之前花了2天时间没有搞定,在甲方一直催促下,今天又捡起来搞搞,搞了一天终于搞定了。相关心得记录如下:...
  • ghevinn
  • ghevinn
  • 2015年06月26日 18:23
  • 950
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 字符编码转换libiconv库
举报原因:
原因补充:

(最多只允许输入30个字)