- 論壇徽章:
- 1
|
作者:sunlan 出處:Unix愛好者家園unix-cd.com
1.1. 編譯libiconv
無論是OpenServer還是UnixWare,SCO的產(chǎn)品對(duì)于中文環(huán)境的支持都做得不是很好。雖然兩者都提供了對(duì)iconv系列函數(shù)的實(shí)現(xiàn),但能支持的字符集都相當(dāng)有限,尤其是不能對(duì)gbk、gb18030等漢字字符集進(jìn)行轉(zhuǎn)換,給在XML中使用中文帶來了困難。
為此,在libxml2庫(kù)編譯的過程中必須使用外帶的iconv庫(kù)替代操作系統(tǒng)所自帶的iconv庫(kù)。我所用的iconv支持庫(kù)是libiconv-1.10。這個(gè)庫(kù)的源代碼能從下面鏈接下載:
![]()
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.10.tar.gz
當(dāng)然,也可以使用其他版本的libiconv庫(kù)。
除提供對(duì)西歐字符集的支持外,libiconv庫(kù)還提供了對(duì)各種亞洲字符集(包括漢字、日文、韓文)的支持:
Chinese
EUC-CN, HZ, GBK, GB18030, EUC-TW, BIG5, CP950, BIG5-HKSCS, ISO-2022-CN, ISO-2022-CN-EXT
Japanese
EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP, ISO-2022-JP-2, ISO-2022-JP-1
Korean
EUC-KR, CP949, ISO-2022-KR, JOHAB
libiconv的編譯過程很簡(jiǎn)單。首先,將源碼包解壓、解包,缺省解包后的路徑為libiconv-1.10。進(jìn)入libiconv-1.10目錄,執(zhí)行
./configure --enable-static=yes
增加”—enable-static=yes”選項(xiàng)是為了生成靜態(tài)庫(kù)。完成配置后,執(zhí)行make編譯libiconv庫(kù)。
完成編譯后,可以通過”make install”命令安裝libiconv環(huán)境。
1.2. 編譯libxml2
最新版本libxml2的源代碼可以從www.xmlsoft.org獲得。此處所使用的版本為libxml2 2.6.19。
在編譯前需要定義環(huán)境變量LD_LIBRARY_PATH,將libiconv.a所在的目錄加入到環(huán)境變量中。這是因?yàn)閘ibxml2的configure配置腳本是從LD_LIBRARY_PATH所定義的路徑中搜索libiconv.a,至于libiconv是靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù)倒沒有關(guān)系。
其次,在SCO OpenServer下編譯libxml2時(shí),由于OpenServer的系統(tǒng)頭文件沒有定義PATH_MAX,需要在testModule.c中手工增加PATH_MAX的定義:
#ifndef PATH_MAX
#ifdef _POSIX_PATH_MAX
#define PATH_MAX _POSIX_PATH_MAX
#else
#define PATH_MAX 255
#endif
#endif
PATH_MAX的值也可以定義為1024或其它的值,但應(yīng)注意不要超過系統(tǒng)上限。
在UnixWare下不需要自己定義PATH_MAX。
接下去是運(yùn)行configure配置腳本。在做這一步操作時(shí)必須要使腳本正確地找到libiconv的位置。有幾種不同的方法可以供采用:
方法一:
./configure --with-iconv=/home/test/libiconv-1.10
其中”--with-iconv”用于指定iconv的源代碼的存放目錄,我們?cè)谶@里假定/home/test/libiconv-1.10。需要注意的是這一目錄必須使用絕對(duì)路徑,否則編譯時(shí)可能會(huì)出錯(cuò)。
方法二:
./configure CFLAGS=”-I/home/test/include”
或者先設(shè)置環(huán)境變量CFLAGS=”-I/home/test/include”,然后直接執(zhí)行
./configure
其中/home/test/include是libiconv的頭文件iconv.h所在的目錄。
以上兩種方法的實(shí)質(zhì)都是要找到正確的liniconv的頭文件和支持庫(kù),用于替換系統(tǒng)自帶的iconv。
configure完成環(huán)境配置后需要注意提示的信息中是否有以下信息:
checking for iconv.h... yes
checking for iconv... no
checking for iconv in -liconv... yes
其中1、3行必須為”yes”,否則說明未能正確地找到iconv。第二行無關(guān)緊要。
接下去的工作就是執(zhí)行make了。通過前面所說的幾步操作,一般情況下都能正常完成編譯過程。
1.3. 編譯后的驗(yàn)證
我們的目標(biāo)是獲得能支持中文編碼的xml支持庫(kù),因此測(cè)試的重點(diǎn)也主要放在對(duì)中文編碼的xml文件上。
首先,運(yùn)行l(wèi)ibxml2自帶的測(cè)試程序testapi,用于測(cè)試libxml2提供的函數(shù)的可用性。在使用SCO Openserver自帶的iconv時(shí),testapi程序會(huì)因?yàn)闊o法進(jìn)行字符集轉(zhuǎn)換而報(bào)許多錯(cuò)誤;在使用libiconv替換后可以正常的通過測(cè)試。
第二,使用xmllint進(jìn)行xml文件解析。xmllint是編譯libxml2時(shí)得到的“副產(chǎn)品”。
手工創(chuàng)建一個(gè)xml文件(假設(shè)名稱為a.xml),內(nèi)容如下:
測(cè)試數(shù)據(jù)
執(zhí)行xmllint a.xml。正常的情況下應(yīng)該能顯示xml文件的內(nèi)容。然后把xml文件中的encoding改為utf8,再次執(zhí)行xmllint,會(huì)出現(xiàn)下面的提示:
a.xml:2: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xB2 0xE2 0xCA 0xD4
測(cè)試數(shù)據(jù)
這就說明編譯出的程序確實(shí)能支持中文編碼。
最后,自己寫程序驗(yàn)證。參照l(shuí)ibxml2提供的示例,最簡(jiǎn)單的程序基本如下:
xmltest.c:
#include
#include "libxml/parser.h"
#include "libxml/tree.h"
main( int argc, char **argv )
{
xmlDocPtr doc;
if( (doc = xmlReadFile( argv[1], NULL, 0)) == NULL )
{
printf( "error!\n" );
exit( -1 );
}
printf( "OK!\n" );
xmlCleanupParser();
exit( 0 );
}
cc –belf –o xmltest xmltest.c –I/home/test/include –L/home/test/lib –lxml2 –liconv –lm –lsocket
編譯成功后執(zhí)行xmltest a.xml,并重復(fù)類似xmllint所做的測(cè)試。當(dāng)然,也可以編寫更全面的測(cè)試程序進(jìn)行測(cè)試。
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/31/showart_509065.html |
|