最佳实践似乎是为此使用 ASCII 英语消息,并假设浏览器正在做正确的事情并且根本不显示这些短语(请参阅下面的详细信息)。
HTTP/1.1 RFC 2616中定义的 HTTP 1.1 响应行的当前状态以及RFC 7230和7231中的更新如下:
- 状态行的格式是
HTTP-Version Status-Code Reason-Phrase CRLF
Reason-Phrase
是TEXT
除CR
和字符之外的任何LF
字符。RFC 7230 实际上说客户端应该忽略原因短语内容。浏览器不应再向用户显示这些原因短语;它们适用于基于文本的浏览器。但是,对于现代浏览器可能仍向用户显示原因短语的任何情况,我都找不到明确的文档。
- 该
TEXT
规则仅用于不打算由消息解析器解释的描述性字段内容和值。MAY的单词仅在根据RFC 2047*TEXT
的规则编码时才包含来自 ISO-8859-1(根据 RFC 2616)以外的字符集的字符。
- RFC 2047 指定语法,例如:
=?iso-8859-1?q?test_S=EEne_li=F0e?=
或=?utf-8?b?dGVzdCBTw65uZSBsacOwZSDhmqDhm4fhmrsgz4PPgM6vz4TOuQ==?=
. 这是其他 HTTP 标头的编码方式,但当前浏览器似乎不支持(在 Chrome 和 Firefox 上测试)
- 在 Chrome 和 Firefox 上进行的简短测试表明,根据 Javascript 控制台和网络选项卡中显示的内容,使用 UTF-8 或 ISO-8859-1 作为响应短语,您的里程可能会有所不同,但 RFC 2047 mime 样式编码永远不会起作用。
这是一个非常简单的 Python 3 服务器,我用来测试它(例如,转到http://127.0.0.1:8080/UTF-8或http://127.0.0.1:8080/rfc2047):
# -*- coding: utf-8 -*-
import sys
from email.header import *
from http.server import HTTPServer, BaseHTTPRequestHandler
from socketserver import ThreadingTCPServer
class TestHTTPRequestHandler(BaseHTTPRequestHandler):
def handle(self):
data = str(self.request.recv(1024), 'ascii')
print("Received request: %r" % data)
if 'GET /' in data:
encoding = data[data.find('GET /')+4:]
encoding = encoding[:encoding.find(' ')].lstrip('/')
if '?' in encoding:
encoding = encoding[:encoding.find('?')]
else:
encoding = "iso-8859-1"
if encoding == 'favicon.ico':
self.request.sendall(b'HTTP/1.1 404 Not Found\r\n')
return
reason_phrase = "test Sîne"
if encoding == "rfc2047":
encoding = "utf-8"
reason_phrase = Header(reason_phrase, encoding).encode()
response = (u"HTTP/1.1 500 %s\r\nContent-Length: 10\r\nContent-Type: text/plain; charset=%s\r\nConnection: Closed\r\n\r\n\"testSîn\"" % (reason_phrase, encoding))
self.request.sendall(response.encode(encoding))
server = ThreadingTCPServer(('127.0.0.1', 8080), TestHTTPRequestHandler)
try:
server.serve_forever()
finally:
server.server_close()