Linux 編碼轉換 (iconv失敗的解決方法)

一開始,調用iconv_open()會返回-1,使用printf("errno=%d\n",errno)查看,返回22,說是invalid argument參數非法。

試了下,確定不是UTF-8或utf-8的大小寫問題。然後按博客http://blog.csdn.net/love_life2011/article/details/7086910#comments所述,更新iconv函數簇爲較新版本後即可。


附http://blog.csdn.net/love_life2011/article/details/7086910#comments內容:

相同的C源程序,在ubuntu11.10上能夠正常執行,而在ARM開發板則不能正常執行,調用
iconv_open("utf-8", "gb2312") 返回失敗,錯誤信息爲“Invalid argument”.
經過查詢資料得知iconv相關函數爲libc中的函數,初步分析得出結論爲有可能是libc版本中
iconv相關函數的版本不同造成的,因此要更新iconv相關函數。
更新iconv相關函數有兩種方法:
第一,更新libc庫;
第二,更新libiconv庫。

第一種方法更新libc庫比較麻煩,因爲我們用的是編譯好的交叉編譯器,這中方法需要重新編譯生成

交叉編譯器,並且也需要使用新編譯生成的交叉編譯工具重新編譯應用程序,因此本方法代價太大,

採用第二種方法。

第二種方法爲只更新libiconv庫,到iconv官網下載最新的庫源碼包,下載地址爲:
http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz
解壓後得到libiconv目錄,閱讀該目錄下Readme文件得出,編譯安裝libiconv庫也有兩種方式:
This library can be built and installed in two variants:

  - The library mode. This works on all systems, and uses a library
    `libiconv.so' and a header file `<iconv.h>'. (Both are installed
    through "make install".)

    To use it, simply #include <iconv.h> and use the functions.

    To use it in an autoconfiguring package:
    - If you don't use automake, append m4/iconv.m4 to your aclocal.m4
      file.
    - If you do use automake, add m4/iconv.m4 to your m4 macro repository.
    - Add to the link command line of libraries and executables that use
      the functions the placeholder @LIBICONV@ (or, if using libtool for
      the link, @LTLIBICONV@). If you use automake, the right place for
      these additions are the *_LDADD variables.
    Note that 'iconv.m4' is also part of the GNU gettext package, which
    installs it in /usr/local/share/aclocal/iconv.m4.

  - The libc plug/override mode. This works on GNU/Linux, Solaris and OSF/1
    systems only. It is a way to get good iconv support without having
    glibc-2.1.
    It installs a library `preloadable_libiconv.so'. This library can be used
    with LD_PRELOAD, to override the iconv* functions present in the C library.

    On GNU/Linux and Solaris:
        $ export LD_PRELOAD=/usr/local/lib/preloadable_libiconv.so

    On OSF/1:
        $ export _RLD_LIST=/usr/local/lib/preloadable_libiconv.so:DEFAULT

    A program's source need not be modified, the program need not even be
    recompiled. Just set the LD_PRELOAD environment variable, that's it!

我在ARM開發板上採用“The libc plug/override mode”實驗成功,下面介紹編譯過程:
在libiconv目錄下:
$./configure --prefix=$PWD/out --host=arm-linux
$make
$make install

上述命令執行完成後會在libiconv目錄下生成新的out目錄,該目錄下存在4個目錄分別是:
bin include lib share

在lib目錄下爲生成的庫文件,其中一個爲preloadable_libiconv.so,把它下載到開發板
的lib目錄下,然後再設置開發板的系統環境變量:
$ export LD_PRELOAD=/lib/preloadable_libiconv.so

然後再執行應用程序即可,正常運行。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章