2016-06-03 2 views
2

Python3에서 간단한 웹 페이지를 제공 할 때 BaseHTTPRequestHandler를 사용하여 인코딩 문제가 발생합니다.python3 : http.server의 UTF-8 인코딩

#!/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) 

예상되는 결과는 내 이름을 표시하는 웹 페이지가 제롬 인 역할을하는 것입니다 : 여기

은 작업 예입니다. 내 이름은 당신이 볼 수 있듯이 JA © rÃ'me

는, HTML 페이지가 제대로 self.wfile.write(bytes(f.read(), 'UTF-8'))와, 인코딩, 그래서 문제가 웹 서버에서 오는 생각 :

대신, 나는 가지고있다.

웹 서버에 UTF-8로 페이지를 제공하도록 지시하는 방법은 무엇입니까?

답변

1

내가 추가하면 문제 없음 : 내 html로 머리에

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

.

1

웹 서버가 이미 UTF-8로 인코딩 된 텍스트를 보내고 있지만 수신 한 바이트의 인코딩을 브라우저에 알려줘야합니다. HTTP 사양. ISO-8995-1을 기본값으로 선언합니다.

HTTP 표준 방법은 헤더 값에 charset 하위 키로 태그를 지정하는 것입니다. 또한,

self.send_header('Content-type', 'text/html; charset=utf-8') 

를 HTML 파일의 인코딩 조심 :

따라서 읽는 코드를 변경해야합니다. open()에 인코딩을 지정하지 않으면 사용자의 로캘에 따라 추측됩니다. 로케일이 C, POSIX 또는 비 - 라틴어 인 경우이 스크립트를 실행하지 않으면 아무 것도 해체되지 않습니다.