Safari 的 XHR 的 Unicode 處理錯誤

45 views
Skip to first unread message

gugod

unread,
Sep 28, 2006, 12:42:26 PM9/28/06
to hsinchu.js
Tag: Bug, Safari, XHR, UTF8, Unicode

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

hlb

unread,
Oct 2, 2006, 1:11:53 AM10/2/06
to hsinchu.js
這個問題可以藉由直接從 Server 端強制在 HTTP Header
裡面送 mimetype text/html; charset="utf-8" 解決喔。

ex, lighttpd.conf:
mimetype.assign = (
......
".html" => "text/html; charset=utf-8",
".htm" => "text/html; charset=utf-8",
".js" => "text/javascript",
......
}

gugod

unread,
Oct 2, 2006, 6:04:54 AM10/2/06
to hsinchu.js

hlb wrote:
> 這個問題可以藉由直接從 Server 端強制在 HTTP Header
> 裡面送 mimetype text/html; charset="utf-8" 解決喔。

hlb,

如果看 RoR 的 bug report 的話,在他的 filter code
裡,是先去檢查 Content-Type 的值,如果有 utf-8
的話再將內容轉成
entity。照這種說法看來的話,就算改了 Content-Type
也應該是無用才對(
不然就沒有進行這種檢查的必要了)。

Cheers,
Kang-min Liu

hlb

unread,
Nov 27, 2006, 7:19:17 AM11/27/06
to hsinchu.js
Safari 如果要 include JSON result,只要指定 script charset 為
utf-8 就解決編碼問題了。

var s = document.createElement('script');
s.setAttribute('src', url);
s.setAttribute('charset', 'utf-8');
document.getElementsByTagName('head')[0].appendChild(s);

Reply all
Reply to author
Forward
0 new messages