从NT向solaris 8移植C/C++应用
從NT向solaris 8移植C/C++應用
客戶端:WINDOWS2000/XP
服務端:NT/SOLARIS/AIX等
最近在向solaris 8中移植應用(服務端應用),遇到的問題還不少。
該應用涉及到的東東有:
IBM MQ530相關,TUXEDO8.0? Xeces-c2.4? iconv? zlib等
?
問題一:
在TUXEDO FML中的中文返回前端是亂碼。但同樣的代碼在NT下沒有問題。
說明:
在該系統中,服務端會將TUXEDO的FML轉化為XML再以UTF-8的編碼轉到客戶端,按常理,只要返回前端是的UTF-8的字符編碼,應該沒問題,因此先查返到前端的中文數據,發現果然不是UTF-8,后再服務端單獨拿Xerces做實驗,發現它的確有問題,因為當時服務端的本地編碼應是GBK,但Xerces本身并不支持GBK,因此,把本地編碼轉成UTF-8時變得亂七八糟,后來用一種最快的方法解決了該問題,不用解析器,而是直接拼字符串,代碼也不會很復雜,拼完后用iconv轉成UTF-8即可。
?
問題二:
客戶端的中文到服務端TUXEDO端后也是亂碼
說明:
該問題其實與上面的問題是一樣的,但處理卻有很大不同,首先,由于前端XML數據復雜,因此必須選用解析器也不能靠自己去解析,其次,Xerces應該可以正常解析UTF-8的XML文檔,為什么出來得不到UTF-8呢?原因是當從DOM中取得XMLCh型的字符串時,還要調用XMLString::transcode方法得到char *,但這過程中Xerces卻自作聰明的想轉成本地編碼,結果轉出來的東西亂七八糟不能使用,解決方法是從XMLCh用XMLFormatter直接讓其輸出UTF-8的字符串,再用iconv轉成本地編碼壓入到FML。(從XMLCh到UTF-8的char *應該有比我更好的方法,歡迎指教)
?
問題三:
一運行到使用vector處便core dump!
說明:
試圖push到vector的類型是一個結構體,大體如下:
struct a{
string a1;
string a2
}
后經查,在對結構體賦植前,對其進行了memset操作,類似:
memset(a, 0, sizeof(a));
去掉該操作后,一切正常,原因是,結構體內有復雜類型,應在構造函數中初始化才是安全的,但這些代碼在NT下正常。
?
問題四:
壓入FML內的數據出來后變成了0
說明:
原因是在Fadd時,該字段其實是short型,但卻壓入了一個int型,但FML的操作中只是壓入了最初的兩個字節,取出來時當然也只有最初壓入的兩個字節,這種代碼在字節序不同的機器上運行的結果是不一樣的。
總結
以上是生活随笔為你收集整理的从NT向solaris 8移植C/C++应用的全部內容,希望文章能夠幫你解決所遇到的問題。