10/12/2006

在 Rails 上面使用 Unicode

如何在 Rails 上面使用 Unicode 是個好問題

基本上,雖然 Ruby 不完整支援 Unicode
但是使用上問題不大
將 Unicode 資料從資料庫取出,操作,output 出
或是在程式裡面使用像是
if a == '我是中文呀'
這類的東西都沒有任何問題


但是如果我們討論到如何在 Rails 上面使用 Unicode就有很多其他的議題了
因為 Rails 牽涉到 Web Server ,HTML,資料庫等等外部的程式
一定要每個節點Unicode設定正確才會正常顯示
Rails Conf 2006 Eourpe 有討論到 Unicode for Rails 的議題
裡面講到幾個基本的使用方式
以下都是使用UTF-8當作範例

1.
你的HTML 是否正確宣告 Unicode ?
請在 head 裡面加入
< meta equiv="Content-type" content="text/html; charset=utf-8" >
這樣的選項

2.
如果使用到字串的函數,你是否有呼叫 KCODE 這個 lib
如果你想使用字串相關的函數,Ruby 是會誤判Unicode字串裡面長度之類的屬性的
我們必須在 config/enviroment.rb 裡面加入
$KCODE='utf8'
這樣的選項,Rails 才會切到 UTF-8 Mode
如此,regular expression 如果使用 u flag 就可以判斷 UTF-8 字串
pack / unpack 才會 work
字串的長度才會正確

3.
資料庫裡面是否正確使用Unicode 編碼
如果是 MySQL ,請用 phpMyAdmin 確定您的編碼是否正確
(話說回來,phpMyAdmin 新版居然有顯示 utf-8 亂碼的問題.... )

4.
資料庫連線是否正確使用
請看看您的 config/database.yml ,是否有下面紅字那一行
他會將連線的mode 切換到 utf-8
production:
user: root
host: localhost
encoding: utf8

5.
Web Server 是否預設使用 UTF-8 編碼
Apache 必須設定
AddDefaultCharset utf-8

Lighttpd 要在 mime type 設定
mimetype.assign = (
".css" => "text/css; charset=utf-8",
".gif" => "image/gif",
".htm" => "text/html; charset=utf-8",
".html" => "text/html; charset=utf-8",
".jpeg" => "image/jpeg",
".jpg" => "image/jpeg",
".js" => "text/javascript; charset=utf-8",
".png" => "image/png",
".swf" => "application/x-shockwave-flash",
".txt" => "text/plain; charset=utf-8"
)

不然可能會有 Javascript 顯示中文的問題
(老實說,我並不太確定如果 Web Server 不設定UTF-8 ,那是否一定會有問題,反正我都這樣設定好)


6.
當這些都確定無誤,還有問題,請確認
你的檔案編碼是否為 Unicode 編碼
通常這個問題是最常發生的

7.
我們可以寫一個 filter
def set_encoding
headers['Content-Type'] ||= 'text/html'
if headers['Content-Type'].starts_with?('text/') and !headers['Content-Type'].include?('charset=')
headers['Content-Type'] += '; charset=utf-8'
end
end
讓 render 出來的 html 都是 UTF-8 encoding
但是 Rails 1.2 將會在 config 裡面新增
ActionController::Base.default_charset=(encoding)
這樣的設定
所以其實我們不需要寫 filter 就可以直接 render unicode 檔案

參考閱讀
  1. 1.URoR 1: Set the Content-Type

1 則留言:

那斯達克 提到...

最近在抓取網頁文件存入mysql時遇到十進位unicode的問題真令人傷透腦筋,因為要在mysql裡做搜尋的動作,因此如果存入的編碼都是& # 2 4 1 8 0 ; & # 6 5 2 9 2 ; & # 3 5 4 8 8 ; & # 2 1 6 9 7;這類文字時還真的不知道該怎麼辦哩(這邊我用空白鍵將數字隔開了),找了許多關於unicode轉碼的文章都是無解,請問高手格主有方法可以解決這個問題嗎?