ann 公告系統
UTF-8 版

我們學校使用 ann 公告系統很多年了都沒有遇到任何問題。最近我升級我們的伺服器從 Fedora 16 至 Fedora 17 之後好像也沒有什麼問題,至少看起來都很正常。但過幾天以後學校有一位老師報告說輸入新公告之後公告標題都不出來。

我們 ann 公告系統都一直使用 Big5 字集 (character set)。我想這個問題是跟我們網路行事曆 WebCalendar 一樣的問題。輸入英文字都正常,但一輸入 Big5 的文字就不會顯示出現。所以我去 Google 找答案了。很不幸的就是什麼都沒有找到。

我想將 ann 公告系統升級到使用 UTF-8 的版本可能會解決這個問題。還好最新的版本 (ann-1.47_utf8.tar.gz) 支援 UTF-8。所以下載之後就很高興的安裝了。但是很糟糕,還是同樣的問題出現。中文就是不會顯示出來。

再一次去 Google 找答案但是還是沒有找到。問題是,公告系統對我們學校是一個很重要的工具。所以無論如何還是要解決這個問題。在這樣沒有辦法的情況之下就要開始試驗了。本來想是 php 的問題,但是在試驗的過程當中發現是 mysql 在搞鬼。這個問題是 mysql 所謂的排序規則 (collation) 問題。

我用 phpMyAdmin 看看 ann 的資料庫時,發現很多的排序規則是 latin1_swedish_ci 跟 UTF-8 一點關係都沒有。所以我開始一步一步更改看看是否會解決我這個問題。過幾天的試驗終於成功了!

以下我列出 ann 資料庫的結構,同時註明哪一些地方我做的修改。除了你是 mysql 專家,要不然我還是建議使用 phpMyAdmin 做修改。

資料庫表 名稱 類型 排序規則 (collation)
anntb
  tid int(10)  
  userid int(10)  
  ip varchar(20) latin1_swedish_ci 改為 utf8_bin
  filename varchar(255) latin1_swedish_ci 改為 utf8_bin
  url varchar(255) latin1_swedish_ci 改為 utf8_bin
  comment blob  
parttb
  partid int(10)  
  pid varchar(8) latin1_swedish_ci 改為 utf8_bin
  partname varchar(24) latin1_swedish_ci 改為 utf8_bin
  partident varchar(64) latin1_swedish_ci 改為 utf8_bin
  rootuid int(10)  
sessions
  session_key char(32) latin1_swedish_ci 改為 utf8_general_ci
  session_expire int(11)  
  session_value text latin1_swedish_ci 改為 utf8_general-ci
titletb
  tid int(10)  
  partid int(10)  
  partname varchar(24) latin1_swedish_ci 改為 utf8_bin
  subject varchar(255) latin1_swedish_ci 改為 utf8_bin
  posttime datetime  
  overtime datetime  
  firsttime datetime  
  hits int(6)  
  type varchar(8) latin1_swedish_ci 改為 utf8_bin
  local varchar(8) latin1_swedish_ci 改為 utf8_bin
  up int(1)  
usertb
  userid int(10)  
  uid char(32) latin1_swedish_ci 改為 utf8_general_ci
  partid int(10)  
  username varchar(12) latin1_bin 改為 utf8_bin
  realname varchar(12) latin1_swedish_ci 改為 utf8_general_ci
  userpass varchar(64) latin1_bin 改為 utf8_bin
  email varchar(64) latin1_swedish_ci 改為 utf8_general_ci
  userident varchar(64) latin1_swedish_ci 改為 utf8_general_ci

現在 ann 系統完全使用中文 UTF-8 碼。雖然如此,但是大部分的人仍然使用 Windows XP 而中文 Windows XP 使用的字集 (character set) 是 Big5 碼。所以一位公告者使用中文 Windows XP 輸入公告時就用 Big5 碼但是這 Big5 碼會自動被轉換成中文 UTF-8 碼。哪如果輸入公告時同時也附件一個檔案。這檔案的檔名也是中文 Big5 碼。同樣這 Big5 碼也會自動被轉換成 中文 UTF-8 碼。目前都沒有問題。問題是使用者使用中文 Windows XP 要下載這檔案時檔案名稱就會有問題,會產生亂碼了因為現在的檔案名稱已經是中文 UTF-8 碼了。所以必須告訴 ann 下載的檔案名稱應該轉換成中文 Big5 碼。

編輯 ann/conf/config.inc.php。在最下面倒數第二列:

$file_name_dl2_big5 = "no"; /* 下載檔案名稱轉為 big5 */

將 no 改成 yes 就可以了。

我無法保證我的修改是正確的。我只能說改了之後我們的 ann 公告系統就正常了。

蔡由世神父
2012/06/28