最近在整合 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-2LEUTF-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 的限制,不好直接附在我們的軟體裡散佈,而必須另外安裝,也只有期待,使用我們的軟體的人,能夠乖乖地看說明書辦事了。


  1. 這裡的「平台」一詞,指的是 compiler,而不是 OS。這故事說來話長,但還是 Microsoft 的錯就是了。
  2. 我目前的工作環境裡,使用的是 MinGW + UnxUtils + Official TCSH/win32 的組合。我不喜歡 Cygwin 的龐大,MinGW 的輕量倒還不錯。另外,TCSH/win32 在 2005 年六月還抓的到,但剛剛我試的結果,該目錄已經找不到了,有需要的人,請各顯神通吧。