工作上遇到有點複雜的配置,系統是 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。
$value= mb_convert_encoding($value,"UCS-2LE","UTF-8");
$value= mb_convert_encoding($value,"big5","UCS-2BE");
$value= mb_convert_encoding($value,"utf-8","big5");
如果用 FreeTDS 去設定 編碼 client charset = UCS-2BE,就抓不到東西,所以暫時只能這樣解。
參考資料:
- 用PHP將Unicode 轉化為UTF-8的實現方法(推)
- php連線sybase(sqlanywhere)資料庫
- ODBC Driver PHP 以及中文變成問號的處理
- iconv 編碼資料
- FreeTDS 手冊