[筆記] FreeTDS 吃 big5 問題

by Mesak

工作上遇到有點複雜的配置,系統是 CentOS,但是 DB 是吃 Sybase

參照了一篇 php連線sybase(sqlanywhere)資料庫 教學,完成 ODBC的安裝,並且用 Laravel PDO 去連線 DB

但是解出來的中文字結果都是問號,google 到了一篇 ODBC Driver PHP 以及中文變成問號的處理

利用設定伺服器語系 setlocale(LC_ALL, “zh_TW.UTF-8”) 的確有抓到中文字,但是語系很明顯是錯的。

接著開始看 FreeTDS 手冊,開啟 DEBUG Log 模式抓到 原始字元從 “UTF-8” <-> “UCS-2LE” 被轉換成 UTF-8

但是我很明確知道DB 的編碼是 bug5 Big5 編碼。

接著在 google iconv 編碼資料 ,找到了一篇 用PHP將Unicode 轉化為UTF-8的實現方法 (農場) ,證實了

UCS-2BE , UCS-2LE 兩個是不同的東西。得出重點:

  • 對於 UCS-2, Windows 下預設是 UCS-2LE 
  • 對於 UCS-2, Linux 下預設是 UCS-2BE

所以在預設的情況下,用 linux 安裝 unixODBC 、FreeTDS 之後 FreeTDS 會去用 UTF-8 去抓資料

所以我的情況是, FreeTDS 用 UCS-2LE 去吃 BIG5 的資料,然後轉成 UTF-8,但是實際上資料存取的應該是 要用 UCS-2BE 轉成 BIG5 模式 ,才會是正確的 BIG5。

如果用 FreeTDS 去設定 編碼 client charset = UCS-2BE,就抓不到東西,所以暫時只能這樣解。

參考資料:

You may also like