ARM开发板上iconv调用失败的解决方法
? ? 當前流行的字符編碼格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是專門處理中文編碼的。而libiconv是一個常用的編碼轉換庫,支持常用的多種編碼之間的轉換。在Linux下,工具鏈gcc有專門的libiconv庫,所有不用移植,但在arm-linux下就沒那么幸運了,需要我們額外移植libiconv庫,不過,過程還是比較簡單的。
?
一、字符編碼轉換libiconv庫介紹
? ??libiconv是一個常用的編碼轉換庫,支持常用的多種編碼之間的轉換。主要函數有:
? ??#include <iconv.h>
? ??iconv_ticonv_open(constchar *tocode, ?const char *fromcode);
? ??size_ticonv(iconv_t cd, ?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)./configure CC=arm-hismall-linux-gcc --target=arm-linux--host=arm-hismall-linux --prefix=$PWD/out?--enable-shared--enable-static
? ??3) make???
? ??4) make install
?
上述命令執行完成后會在libiconv目錄下生成新的out目錄,該目錄下存在4個目錄分別是:
bin include lib share
在lib目錄下為生成的庫文件,其中一個為preloadable_libiconv.so,把它下載到開發板
的lib目錄下,然后再設置開發板的系統環境變量:
$ export LD_PRELOAD=/lib/preloadable_libiconv.so
然后再執行應用程序即可,正常運行。
?
三、實例unicode.cpp
?
//#include <iconv.h> #include <iostream> #include <string.h> #include "./iconv.h" using namespace std;// 代碼轉換操作類 class CodeConverter { private:iconv_t cd;public:// 構造CodeConverter(const char *from_charset, const char *to_charset) {cd = iconv_open(to_charset, from_charset);}// 析構~CodeConverter() {iconv_close(cd);}// 轉換輸出int convert(char *inbuf, int inlen, char *outbuf, int outlen) {char **pin = &inbuf;char **pout = &outbuf;memset(outbuf, 0, outlen);return iconv(cd, pin, (size_t *)&inlen, pout, (size_t *)&outlen);} };int main(int argc, char **argv) {char *gb2312 = "我是中國人";char out0[256] = {0};char out1[256] = {0};// gb2312-->utf-8CodeConverter cc0 = CodeConverter("gb2312","utf-8");cc0.convert(gb2312, strlen(gb2312)+1, out0, 256);cout << "gb2312-->utf-8 in=" << gb2312 << ",out0=" << out0 << endl;// utf-8-->gb2312CodeConverter cc1 = CodeConverter("utf-8", "gb2312");cc1.convert(out0, strlen(out0)+1, out1, 256);cout << "utf-8-->gb2312 in=" << out0 << ",out1=" << out1 << endl; return 0; }?arm-hismall-linux-g++ unicode.cpp -L./-liconv? //靜態庫然后nfs下載到板子上或直接運行就ok了。
?
如果遇到iconv轉換異常,可用perror("iconv")來查看錯誤提示,以上代碼我在FreeBSD下進行utf-8 -> gb2312轉換失敗,原因是iconv_open的兩個參數都是小寫的,而通過man iconv或iconv -l看到iconv支持的所有編碼字符串均為大寫。
?
轉載于:https://www.cnblogs.com/young525/p/6225489.html
總結
以上是生活随笔為你收集整理的ARM开发板上iconv调用失败的解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python ==》 元组
- 下一篇: Atitit 知识管理的重要方法 数据来