答案 0 :(得分: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规则仅用于描述性字段内容和不打算由消息解析器解释的值。 * TEXT的单词只有在符合RFC 2047 [14]的规则编码时才包含ISO-8859-1 [22]以外的字符集中的字符。
TEXT = <any OCTET except CTLs, but including LWS>
(4.2表示标题由TEXT组成)
任何八位字节序列与ASCII不同,文本“可以包含ISO-8859-1 [22]以外的字符集中的字符,只有在编码时”似乎(对我来说)间接建议标题是ISO -8859-1。然而,这不如该句子的整个部分重要:
* TEXT的单词只有在符合RFC 2047 [14]的规则编码时才包含ISO-8859-1 [22]以外的字符集中的字符。
确实,RFC 2047为我们提供了一种方法,可以将任何字符集中的任何字符串编码为ASCII。 (RFC 2047是电子邮件如何在主题行或发件行中包含日语等内容。)
现在可悲的是:我认为没有任何主流浏览器实现RFC 2047.正如您所见,Chrome将标题视为UTF-8,Firefox视为ISO-8859-1。你可以发送它在RFC 2047中编码,或类似于base64的东西,并在javascript中对其进行解码,但此时,你也可以将其发送到正文中。
答案 1 :(得分:0)
听起来很明显,但您是否已清除浏览器缓存,或尝试在Ajax请求中设置“cache:false”?
答案 2 :(得分:0)
HTTP标头值编码与您网页的编码无关。
特别是,标头值通常仅限于ASCII,除非定义标头的规范表明RFC 2047适用。通过字节膨胀(对ASCII来说是正确的)将字节转换为相应的Unicode代码点将为您提供上面看到的IE和Firefox结果。