python3: http.server 中的 UTF-8 编码
python3: UTF-8 encoding in http.server
我在 python3 中使用 BaseHTTPRequestHandler 提供简单网页时遇到编码问题。
这是一个工作示例:
#!/usr/bin/python3
# -*- coding: utf-8 -*
from http.server import BaseHTTPRequestHandler, HTTPServer
from os import curdir, sep, remove
import cgi
HTML_FILE_NAME = 'test.html'
PORT_NUMBER = 8080
# This class will handles any incoming request from the browser
class myHandler(BaseHTTPRequestHandler):
# Handler for the GET requests
def do_GET(self):
self.path = HTML_FILE_NAME
try:
with open(curdir + sep + self.path, 'r') as f:
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(bytes(f.read(), 'UTF-8'))
return
except IOError:
self.send_error(404, 'File Not Found: %s' % self.path)
try:
# Create a web server and define the handler to manage the incoming request
with open(HTML_FILE_NAME, 'w') as f:
f.write('<!DOCTYPE html><html><body> <p> My name is Jérôme </p> </body></html>')
print('Started httpserver on port %i.' % PORT_NUMBER)
#Wait forever for incoming http requests
HTTPServer(('', PORT_NUMBER), myHandler).serve_forever()
except KeyboardInterrupt:
print('Interrupted by the user - shutting down the web server.')
server.socket.close()
remove(HTML_FILE_NAME)
预期的结果是提供一个显示 我叫 Jérôme。
的网页
相反,我有:我叫 Jérôme
如您所见,html 页面编码正确,self.wfile.write(bytes(f.read(), 'UTF-8'))
,所以我认为问题出在网络服务器上。
如何告诉网络服务器以 UTF-8 格式提供页面?
您的网络服务器已经在发送编码为 UTF-8 的文本,但您需要告诉浏览器它接收到的字节的编码。 HTTP规范。声明 ISO-8995-1 为默认值。
HTTP 标准的做法是用 charset
sub-key.
标记 Content-type
header 值
因此,您应该将代码更改为:
self.send_header('Content-type', 'text/html; charset=utf-8')
此外,请注意 HTML 文件的编码。如果没有 encoding given to open()
,系统会根据您的区域设置进行猜测。这不会破坏任何东西,除非您最终 运行 这个语言环境为 C
、POSIX
或 non-latin Windows.
的脚本
如果我添加没问题:
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
在我的 html 脑袋里。
我在 python3 中使用 BaseHTTPRequestHandler 提供简单网页时遇到编码问题。
这是一个工作示例:
#!/usr/bin/python3
# -*- coding: utf-8 -*
from http.server import BaseHTTPRequestHandler, HTTPServer
from os import curdir, sep, remove
import cgi
HTML_FILE_NAME = 'test.html'
PORT_NUMBER = 8080
# This class will handles any incoming request from the browser
class myHandler(BaseHTTPRequestHandler):
# Handler for the GET requests
def do_GET(self):
self.path = HTML_FILE_NAME
try:
with open(curdir + sep + self.path, 'r') as f:
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(bytes(f.read(), 'UTF-8'))
return
except IOError:
self.send_error(404, 'File Not Found: %s' % self.path)
try:
# Create a web server and define the handler to manage the incoming request
with open(HTML_FILE_NAME, 'w') as f:
f.write('<!DOCTYPE html><html><body> <p> My name is Jérôme </p> </body></html>')
print('Started httpserver on port %i.' % PORT_NUMBER)
#Wait forever for incoming http requests
HTTPServer(('', PORT_NUMBER), myHandler).serve_forever()
except KeyboardInterrupt:
print('Interrupted by the user - shutting down the web server.')
server.socket.close()
remove(HTML_FILE_NAME)
预期的结果是提供一个显示 我叫 Jérôme。
的网页相反,我有:我叫 Jérôme
如您所见,html 页面编码正确,self.wfile.write(bytes(f.read(), 'UTF-8'))
,所以我认为问题出在网络服务器上。
如何告诉网络服务器以 UTF-8 格式提供页面?
您的网络服务器已经在发送编码为 UTF-8 的文本,但您需要告诉浏览器它接收到的字节的编码。 HTTP规范。声明 ISO-8995-1 为默认值。
HTTP 标准的做法是用 charset
sub-key.
Content-type
header 值
因此,您应该将代码更改为:
self.send_header('Content-type', 'text/html; charset=utf-8')
此外,请注意 HTML 文件的编码。如果没有 encoding given to open()
,系统会根据您的区域设置进行猜测。这不会破坏任何东西,除非您最终 运行 这个语言环境为 C
、POSIX
或 non-latin Windows.
如果我添加没问题:
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
在我的 html 脑袋里。