Right libiconv version for Windows
最近在整合 libiconv,希望能夠解決一些跨平台[1]文字轉碼的問題。程式寫得很高興,結果移到 Windows 上一執行,卻不能執行,檢查的結果,是不支援 WCHAR_T,嘗試改轉成 UCS-2LE 或是 UTF-16LE,雖然可以轉,但有些字還是會爛掉。經過追查的結果發現,一切都是版本的問題。
對於曾經體驗過 GNU、Linux 以及其他 Open Source 軟體的好處的人來說,如果能夠也在 Windows 平台上,使用這些工具,那可真是一大樂事,多少能夠讓 Windows 變得稍微好用一些。因此,一直以來,這些 open source 軟體,不斷有官方或非官方的人或組織,在進行著 windows porting 的工作。大喀的有 Cygwin/MingGW,小喀的也有 UnxUtils 這類計畫存在[2]。而在 libiconv 的官方網站裡,也可以下載的到一個叫做 libiconv-1.9.1.bin.woe32.zip 的特別版本,將這個版本解開後,通常是放到 C:\usr 下,設定好 PATH 環境變數,即可使用。這正是原本我在 Windows 上使用的 libiconv 版本。
但今天卻發現,這個 1.9.1-woe32 的版本,compile/link 程式都沒有問題,但就是沒有 WCHAR_T,也會讓 UCS-2LE 或 UTF-16LE 的某些字爛掉。測了一下從 google 找到的幾個 libiconv for windows implementation,發現 GnuWin32 所提供的 libiconv,並沒有這個問題。換用了這個版本,跑一遍所有的 test case,這才很高興地確認,這一版,才是對的。
觀察了一下 GnuWin32,發現這是目前我所找到的,比較好的 GNU/OpenSource on Win32 的 solution。其一,皆是 native porting,不必像 Cygwin 那樣拖著一個大大的 unix emulation layer;其二,包裝的比較完整,除了各個 package 有 installer 之外,也皆按照 Windows 的習慣,統一安裝到 C:\Program Files\GnuWin32 目錄下,並形成完整的 UNIX 目錄結構,而且,對 DLLs 按右鍵看內容,也都有完整的版權與版本資訊。換句話說,GnuWin32「看起來」比較像個「正式的」GNU win32 solution。
所以,用這版的就對了啦!只可惜最後我還是找不到方法,在 compile-time、link-time 甚至在 run-time 檢查使用 libiconv 版本是否正確。不過,既然因為 LGPL 的限制,不好直接附在我們的軟體裡散佈,而必須另外安裝,也只有期待,使用我們的軟體的人,能夠乖乖地看說明書辦事了。
Random Posts
- None Found
Similar Posts
- None Found
5 Comments
“觀察了一下 GnuWin32,發現這是目前我所找到的,比較好的 GNU/OpenSource on Win32 的 solution。其一,皆是 native porting,不必像 Cygwin 那樣拖著一個大大的 unix emulation layer”
非常同意,找iconv的win32库,跑到了gnuwin32上,下来看了下居然不是用cygwin的,非常不错。
配上 tcsh-win32 以及 vim-win32,基本上我已經可以在 win32 上用 unix 的方法做很多事情。
When I run the application compile and link with VC6, I got the error access violation.
Can you tell me why?
Thanks a lot.
When I run the applicaiton which is compiled ank linked using VC6, I got an error that access violation. Can you tell me why?
My application links to libiconv.lib. No error happens when compiling and linking.
Thanks a lot.
Dear Welbon Wang,
Usually, when there is access violation errors, it means there is something wrong with your pointers.
For example, when pointer
p(which point to a structure) isNULL,p-<fieldwill cause such kind of error.Jeff Hung
Post a Comment