字符集转换的有关libiconv的问题??

发表于:2007-05-25来源:作者:点击数: 标签:问题libiconv有关字符集转换
iconv_open("unicode","gb2312")函数我在 linux 下运行正常,再solaris下 给我报错,我查了一下资料,说是libiconv的问题,然后我就看相关资料libiconv的安装,这个libiconv怎样安装? AsusualforGNUpackages: $./configure--prefix=/usr/local $make $makei

iconv_open("unicode","gb2312")函数我在linux下运行正常,再solaris下 
给我报错,我查了一下资料,说是libiconv的问题,然后我就看相关资料libiconv 的安装,这个libiconv怎样安装? 


As usual for GNU packages: 
$ ./configure --prefix=/usr/local 
$ make 
$ make install 

After installing GNU libiconv for the first time, it is recommended to recompile and reinstall GNU gettext, so that it can take advantage of libiconv. 

On systems other than GNU/Linux, the iconv program will be internationalized only if GNU gettext has been built and installed before GNU libiconv. This means that the first time GNU libiconv is installed, we have a circular dependency between the GNU libiconv and GNU gettext packages, which can be resolved by building and installing either 

*first libiconv, then gettext, then libiconv again, 

or (on systems supporting shared libraries, excluding AIX) 

*first gettext, then libiconv, then gettext again. 

1.这个libiconv怎样安装,这样对吗? 
#ls 
libiconv-1.9.1.tar 
#tar -xvf libiconv-1.9.1.tar 
#cd libiconv-1.9.1 
#./configure 
#make 
#make install 

"--prefix=/usr/local"这个配置参数要吗?要的话怎样完整的写,希望各位 
赐教!! 

2. 按照上面的说的,这个库libiconv完整的安装怎样安装,gettext这个是 
啥东西,怎样完整的安装??? 

3. 用pkginfo能看到libiconv和gettext这两个库的信息吗?怎麽看?能不能 
看一下安装之前有没有libiconv这个库??

 lixiaosi 回复于:2003-11-17 17:59:55
没人会吗?

 gadfly 回复于:2003-11-17 22:20:24
gettext是GNU的软件包,你可以到sunfreeware.com上去下载二进制软件包安装。

/usr/local应该是缺省的路径,带不带都无所谓的。

你上个帖子我回了呀,给了两个链接,应该有安装和使用说明吧?

 lixiaosi 回复于:2003-11-18 09:40:03
gadfly版主,最后问一个完全安装的问题,我依照GNU提供的文档,分析
完全安装的步骤如下:
1. 
#ls
libiconv-1.9.1.tar.gz
gettext-0.12.1.tar.gz
#tar  -zxvf     libiconv-1.9.1.tar.gz
#tar  -zxvf     gettext-0.12.1.tar.gz
#cd    libiconv-1.9.1
#./configure   --prefix=/usr/local
#make 
#make  install


2.
#cd    gettext-0.12.1
#ls
gettext-0.12.1
#./configure   --prefix=/usr/local
#make 
#make  install

3.
#cd    libiconv-1.9.1
#ls
libiconv-1.9.1
#make distclean
#./configure   --prefix=/usr/local
#make 
#make  install

上面的完全安装步骤对否?

 lixiaosi 回复于:2003-11-18 11:20:19
我按照上面的方法安装,没有成功,报错如下:
# make  install
builddir="`pwd`"; cd libcharset && make all && make install-lib libdir="$builddi
r/lib" includedir="$builddir/lib"
make[1]: Entering directory `/usr/temp/libiconv/libiconv-1.9.1/libcharset'
cd lib && make all
make[2]: Entering directory `/usr/temp/libiconv/libiconv-1.9.1/libcharset/lib'
/bin/sh ../libtool --mode=link gcc  -o libcharset.la -rpath /usr/local/lib -vers
ion-info 1:0:0 -no-undefined localcharset.lo relocatable.lo
rm -fr  .libs/libcharset.so .libs/libcharset.so.1 .libs/libcharset.so.1.0.0
gcc -shared -Wl,-h -Wl,libcharset.so.1 -o .libs/libcharset.so.1.0.0  .libs/local
charset.o .libs/relocatable.o  -lc
(cd .libs && rm -f libcharset.so.1 && ln -s libcharset.so.1.0.0 libcharset.so.1)
(cd .libs && rm -f libcharset.so && ln -s libcharset.so.1.0.0 libcharset.so)
false cru .libs/libcharset.a  localcharset.o relocatable.o
make[2]: *** [libcharset.la] Error 1
make[2]: Leaving directory `/usr/temp/libiconv/libiconv-1.9.1/libcharset/lib'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/usr/temp/libiconv/libiconv-1.9.1/libcharset'
make: *** [lib/localcharset.h] Error 2


这是为啥,怎样才能安装成功?

 lixiaosi 回复于:2003-11-18 16:32:06
我看源码编译不成功,就从www.sunfreeware.com
上面下载了gettext-0.11.5-sol9-sparc-local.gz和
libiconv-1.8-sol9-sparc-local.gz安装上,还是报以前
的错:
iconv_open():: Invalid argument

我真得很无奈呀,谁能帮一把??

 gadfly 回复于:2003-11-18 16:43:20
sorry,上次回的不是你发的贴子。
呵呵,问题几乎一样。我以为是你问过的。
http://chinaunix.net/forum/viewtopic.php?t=200502

你可以问问heartk,看她解决没有。

缺省的也许是不行。

我用源码安装试试看。试完再告诉你结果

 lixiaosi 回复于:2003-11-18 16:51:10

先谢谢了!

 gadfly 回复于:2003-11-18 17:40:18
我装了一下,应该问题不大了。
方法,如下。
1、从sunfreeware分别下载gettext和libiconv
注意,是二进制的安装包,而不是源码包
2、gunzip 这两个软件包,然后
pkgadd -d gettext*
pkgadd -d libiconv*

3、export PATH=/usr/local/bin:$PATH
这个目的是用来用gnu的iconv代替solaris自带的iconv
这样你就可以测试了。
$ iconv -l|grep -i UTF
UTF-8
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
UNICODE-1-1-UTF-7 UTF-7 CSUNICODE11UTF7
$ iconv -l|grep -i unicode
ISO-10646-UCS-2 UCS-2 CSUNICODE
UCS-2BE UNICODE-1-1 UNICODEBIG CSUNICODE11
UCS-2LE UNICODELITTLE
UNICODE-1-1-UTF-7 UTF-7 CSUNICODE11UTF7

你会发现这个iconv是支持utf-16的。我记得unicode指的就是utf-16

所以命令行测试,你就可以用
$iconv -f gb2312 -t utf-16 your_data_file
相比solaris自带的
/usr/bin/iconv -f gb2312 -t utf-16 test_conv.c
就报错。
注意上面不要在步骤4之后测试,否则用的库是gnu的,就不会报错了。

4、export LD_PRELOAD=/usr/local/lib/libiconv_plug.so
这个目的就是用来替换libc的缺省iconv库函数的
所以你测试源码中这样写
iconv_open("utf-16", "gb2312");
or
iconv_open("gb2312", "utf-16");
编译的时候需要带-liconv

 lixiaosi 回复于:2003-11-18 18:06:27
高人呀,我按照你说的一步步做下来
就没有问题了
厉害厉害!
困扰我一星期问题终于解决了
我都不知道说啥好了
还是要说谢谢谢谢谢!
祝好运!!

 gadfly 回复于:2003-11-18 18:29:32
呵呵,到北京请我吃饭好了。

经常有人问iconv相关的问题,有时间整理个相关的帖子。

现设为精彩,以备后查吧。

 lixiaosi 回复于:2003-11-19 09:29:07
行,没问题
呵呵

 lixiaosi 回复于:2003-11-19 11:14:18
gadfly,又出现问题了,我在我的环境里面加上这个:
LD_PRELOAD=/usr/local/lib/libiconv_plug.so;export LD_PRELOAD
然后在环境里面就有了LD_PRELOAD=/usr/local/lib/libiconv_plug.so
然后我查看用户进程,就这样:
$ ps
ld.so.1: ps: fatal: /usr/local/lib/libiconv_plug.so: wrong ELF class: ELFCLASS32
Killed
$
$ ps -ef|grep  hhf
ld.so.1: ps: fatal: /usr/local/lib/libiconv_plug.so: wrong ELF class: ELFCLASS32
$
然后我把环境里面的这个一行LD_PRELOAD=/usr/local/lib/libiconv_plug.so;export LD_PRELOAD
屏蔽了,查看进程就好了,是不是哪里有问题?我屏壁掉这一行以后,
继续运行我有关UTF-16和gb2312转换的程序,依旧是没问题?这是为何?

 lixiaosi 回复于:2003-11-19 14:44:08
sqlplus   sys/sys

SQL*Plus: Release 8.1.7.0.0 - Production on Wed Nov 19 14:07:30 2003

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

ld.so.1: oraclekgl: warning: /usr/local/lib/libiconv_plug.so: open failed: illeg
al insecure pathname

Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.7.0.0 - 64bit Production


$ su  root
ld.so.1: su: warning: /usr/local/lib/libiconv_plug.so: open failed: illegal inse
cure pathname
Password:
#

一旦把LD_PRELOAD=/usr/local/lib/libiconv_plug.so加在环境中,就出现这样的警告,这是为何??

 lixiaosi 回复于:2003-11-19 16:56:05
gadfly,是不是我在安装
pkgadd -d gettext* 
pkgadd -d libiconv* 
这两个包的时候我用的是root用户
而我的执行程序的用户使hhf,是不是该用
hhf用户来安装这两个包??

 lixiaosi 回复于:2003-11-19 17:12:00
应该不是,我把
LD_PRELOAD=/usr/local/lib/libiconv_plug.so;export LD_PRELOAD 
加在root用户的环境变量里面,一样出现上面的错
这就奇怪了

 gadfly 回复于:2003-11-19 20:37:07
两个办法:
1、按上面的方法重新编译后,运行
ldd your_program
你看看有没有
libiconv.so.2 =>         /usr/local/lib/libiconv.so.2
这样的字样。
如果有,以后运行your_program就没必要export这个环境变量了。
2、如果没有
你就做个启动脚本,wrapper your_program。
脚本中,执行你的程序之前export这个环境变量,执行后,unset这个环境变量,这样就不会有问题了。

 lixiaosi 回复于:2003-11-20 11:18:08
我按照你说的,做了一下,
1。 我没有在环境中加LD_PRELOAD=/usr/local/lib/libiconv_plug.so
然后做了一下
$ ldd  send
        libsocket.so.1 =>        /usr/lib/libsocket.so.1
        libnsl.so.1 =>   /usr/lib/libnsl.so.1
        libiconv.so.2 =>         /usr/local/lib/libiconv.so.2
        libc.so.1 =>     /usr/lib/libc.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        libmp.so.2 =>    /usr/lib/libmp.so.2
        /usr/platform/SUNW,UltraAX-i2/lib/libc_psr.so.1
$
显示有
libiconv.so.2 =>         /usr/local/lib/libiconv.so.2
这样的话就没有必要加LD_PRELOAD=/usr/local/lib/libiconv_plug.so
这个了,是吧,呵呵

2。这个脚本shell很简单,会写,呵呵,只是已经有上面的了,就不必写这个shell了

呵呵,谢谢gadfly

libiconv_plug.so和libiconv.so.2,这两个库有啥必然的联系?不明白
为啥已经在环境中了?

 lixiaosi 回复于:2003-11-20 13:15:06
我现在对引用的头文件又出现了疑问,我在头文件里面这样写:
#include <iconv.h>

#include "/usr/local/include/iconv.h"
这两种写法编译出的程序是一样的,执行都没有问题
然后我这样$ldd   server,都能显示libiconv.so.2 => /usr/local/lib/libiconv.so.2

 我就有点不明白的是:
#include <iconv.h>引用的永远都是/usr/include下的
头文件,那为何用这个头文件编译出的程序还是能用呢??

 gadfly 回复于:2003-11-20 20:48:39
1、头文件只是编译的时候需要的,和运行没有关系,所以只要不同库函数的接口一样,头文件用哪一个无所谓的。

2、程序如果运行中,会先调用LD_PRELOAD指定的动态库中的函数(如果有的话)会,而不会用缺省的链接指定的动态库中的函数。
既然你的程序已经指定的是这个动态库,就不用这个环境变量指定了。
我估计这两个动态库是一样的东西。
如果指定这个环境变量,同样会影响其它的程序,如果接口上有所不同,或
有系统安全检查的话,就会报错或发出警告。所以如果要用,就尽量减少影响范围。

 非常开心 回复于:2003-11-21 11:38:13
libiconv只能调用一次?×××

 lixiaosi 回复于:2003-11-21 18:00:52
谢谢谢谢!
彻底的解决了
呵呵!

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)