2011-11-04 101 views
1

我正在使用Zend Framework。我試圖通過使用一個Ajax請求的行動來驗證形式:IE瀏覽器和Firefox不顯示UTF-8,而Chrome卻不顯示

$.ajax({ 
     type: "POST", 
     url: URL_TO_ACTION, 
     data: DATA, 
     success: function(result,status,xResponse) { 
       var error = xResponse.getResponseHeader("error"); 
        alert(error); 
       }, 
       error: function(e){ 
        alert(e); 
       } 
     }); 

在控制器中,我有處理這一個動作:

public function validateAction(){ 
    $response = $this->_response; 
    $response->setHeader(
      "error","Hãy chọn một module" 
     );  
} 

在IE和Firefox,它說:「哈£ý槎»N MA»噸模塊」,而鉻說‘乾草CHON MOT模塊’

在佈局我有:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

我在這裏做錯了什麼?

回答

0

聽起來很明顯,但你清除了瀏覽器緩存,或嘗試在你的Ajax請求中設置「cache:false」嗎?

+0

我做到了,但沒有運氣。 –

0

HTTP標頭值編碼與您的頁面編碼無關。

特別是,標頭值通常限制爲ASCII,除非定義標頭的規範說明RFC 2047適用。通過字節膨脹(這對ASCII是正確的)將字節轉換爲相應的Unicode代碼點可以爲您提供您在上面看到的IE和Firefox結果。

1

不要依賴於HTTP頭能夠傳輸ASCII以外的任何東西。將您的錯誤消息編碼到實體主體中。

長的答案:

這一點,在我看來,HTTP標準的蘇茨基區域。根據HTTP/1.1的標準,

HTTP頭字段包括通用頭(4.5節),請求頭(5.3節),響應頭(6.2節)和實體頭( 7.1節)字段,遵循與RFC 822 [9]第3.1節中給出的相同的通用格式。

RFC 822說,

3.1.2。字段的結構

一旦一個字段被展開,它可能會被視爲由一個字段名,後跟一個冒號(「:」),後跟一個字段體,並由一個回車符返回/換行符。字段名稱必須由可打印的ASCII字符組成(即,值爲33到126之間的數字,十進制,冒號除外)。字段主體可以由除CR或LF以外的任何ASCII字符組成。

因此,HTTP頭是ASCII。然而,在文檔的早期版本中,HTTP/1.1有這樣的說法:

TEXT規則僅用於描述性字段內容和值,不打算由消息解析器解釋。僅當根據RFC 2047 [14]的規則進行編碼時,* TEXT的字可能包含來自ISO-8859-1 [22]以外字符集的字符。

TEXT   = <any OCTET except CTLs, 
        but including LWS> 

(和4。2表示標題由文本組成)

任何八位字節序列與ASCII不相同,並且文本「可能包含僅來自ISO-8859-1 [22]以外的字符集的字符」我)間接建議標題是ISO-8859-1。然而,這並不重要:

只有在根據RFC 2047的規則進行編碼時,* TEXT的字可以包含來自ISO-8859-1 [22]以外字符集的字符[ 14。

事實上,RFC 2047給了我們一種方法,可以將任何字符集中的任何字符串編碼爲ASCII。 (RFC 2047是電子郵件如何在主題行或From行中包含諸如日語之類的東西)。

現在對於可悲的部分:我不認爲任何主流瀏覽器都實現了RFC 2047。看來,Chrome會將標題視爲UTF-8,Firefox會將其視爲ISO-8859-1。你可以發送它在RFC 2047中編碼,或類似base64的東西,然後在javascript中解碼它,但是在那個時候,你可以直接發送它到主體中。

相關問題