見 http://wiki.rubyonrails.org/rails/pages/HowToUseUnicodeStrings
簡單將問題的重點摘要如下:
造成問題的場合在於,使用 XMLHttpRequest 去 Server
拿資料時,如果 Server 傳回來的是
UTF8 編碼的資料,在 Safari
上看到的,會有部份字元為亂碼,如果是中文資料的話則全為
亂碼。猜測是 Safari 將其以 Latin1 編碼解讀所致。
此問題無法以 Javascript 解,必需在 Server 端將所有 UTF8
資料變成 Number Entity,
如 轶
這樣的格式。但如果所有資料皆轉,對於本來可以正確處理的其他瀏覽器實為多餘。
所以在 Server 端應要應有以下的判別式:
1. 是 Safari 送來的 request
2. 是呼叫 XMLHttpRequest 函式的而來的
3. response 的編碼設為 UTF8
第一項可以看 HTTP_USER_AGENT 是否拿有 "AppleWebKit"
字樣。第二項則需要 Javascript 端多送出 HTTP Header
才行。如果使用 prototype.js 的話,其 Ajax.Request 這個
class 已經會送出 "X-Requested-With: XMLHttpRequest" 這一套
header,可以此判別。第三項則是去檢查 response 的
Content-Type。
Cheers,
Kang-min Liu
ex, lighttpd.conf:
mimetype.assign = (
......
".html" => "text/html; charset=utf-8",
".htm" => "text/html; charset=utf-8",
".js" => "text/javascript",
......
}
hlb,
如果看 RoR 的 bug report 的話,在他的 filter code
裡,是先去檢查 Content-Type 的值,如果有 utf-8
的話再將內容轉成
entity。照這種說法看來的話,就算改了 Content-Type
也應該是無用才對(
不然就沒有進行這種檢查的必要了)。
Cheers,
Kang-min Liu
var s = document.createElement('script');
s.setAttribute('src', url);
s.setAttribute('charset', 'utf-8');
document.getElementsByTagName('head')[0].appendChild(s);