【问题标题】:IE and Firefox don't show UTF-8 while Chrome doesIE 和 Firefox 不显示 UTF-8 而 Chrome 显示
【发布时间】:2011-11-04 09:29:07
【问题描述】:

我正在使用 Zend 框架。我尝试通过对 Action 使用 Ajax 请求来验证表单:

$.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);
                }
      });

在控制器中,我有一个 Action 来处理这个问题:

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

在 IE 和 Firefox 中,它显示“Hãy chá»n má»t Module”,而 Chrome 显示“Hãy chọn một module”

在我的布局中:

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

我在这里做错了什么?

【问题讨论】:

    标签: internet-explorer firefox google-chrome jquery utf-8


    【解决方案1】:

    不要依赖 HTTP 标头能够传输 ASCII 以外的任何内容。在您的实体正文中编码您的错误消息。

    长答案:

    在我看来,这是 HTTP 标准的一个糟糕领域。根据 HTTP/1.1 的标准,

    HTTP 标头字段,包括 general-header(第 4.5 节)、request-header(第 5.3 节)、response-header(第 6.2 节)和 entity-header(第 7.1 节)字段,遵循相同的通用格式在 RFC 822 [9] 的第 3.1 节中给出。

    RFC 822 说,

    3.1.2。标题字段的结构

    一旦一个字段被展开,它可以被视为由一个字段名后跟一​​个冒号(“:”),后跟一个字段正文,并以回车/换行结束.字段名称必须由可打印的 ASCII 字符组成(即,值介于 33. 和 126. 之间的字符,十进制,冒号除外)。 field-body 可以由任何 ASCII 字符组成,CR 或 LF 除外。

    因此,HTTP 标头是 ASCII。然而,在文档的前面,HTTP/1.1 有这样的说法:

    TEXT 规则仅用于不打算由消息解析器解释的描述性字段内容和值。仅当根据 RFC 2047 [14] 的规则进行编码时,*TEXT 的字可能包含来自 ISO-8859-1 [22] 以外的字符集的字符。

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

    (并且 4.2 表示标题由 TEXT 组成)

    任何八位字节序列都与 ASCII 不同,并且文本“可能包含来自 ISO-8859-1 [22] 以外的字符集的字符,仅在根据编码时”似乎(对我而言)间接暗示标头是 ISO -8859-1。然而,这不如那句话的全部重要:

    只有在根据 RFC 2047 [14] 的规则进行编码时,*TEXT 的单词才可以包含来自 ISO-8859-1 [22] 以外的字符集的字符。

    确实,RFC 2047 为我们提供了一种将任何字符集中的任何字符串编码为 ASCII 的方法。 (RFC 2047 是电子邮件如何在主题行或发件人行中包含日语等内容的方式。)

    现在是可悲的部分:我认为目前没有任何主流浏览器实现 RFC 2047。正如您所见,Chrome 将标头视为 UTF-8,Firefox 将其视为 ISO-8859-1。您可以将其以 RFC 2047 或类似的方式(如 base64)编码发送,然后在 javascript 中对其进行解码,但此时您也可以将其发送到正文中。

    【讨论】:

      【解决方案2】:

      听起来很明显,但您是否已清除浏览器缓存,或尝试在 Ajax 请求中设置“cache: false”?

      【讨论】:

        【解决方案3】:

        HTTP 标头值编码与您页面的编码无关。

        特别是,标头值通常限制为 ASCII,除非定义标头的规范说明适用 RFC 2047。通过字节膨胀(对于 ASCII 是正确的)将字节转换为相应的 Unicode 代码点将为您提供您在上面看到的 IE 和 Firefox 结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-25
          • 1970-01-01
          • 2023-03-17
          • 2013-03-08
          • 2015-01-11
          • 2012-09-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多