前提・実現したいこと
「実践力を身につける pythonの教科書」でPythonを自習しています。
書籍の中にあるサンプルコードを写経して(Chapter5-3にあるものです)WEBのチャットアプリを作成したのですが、WEBブラウザで表示すると文字化けしてしまいます。
ソースコード内ではUTF-8を指定しており、かつファイルもUTF-8で保存していますが、WEBブラウザからですと文字化けてしまいます。
発生している問題・エラーメッセージ
本来出力されるはずの文字
名前: 本文:
表示される文字
���O�F �{���F
該当のソースコード
Python
1#!/usr/bin/env python 2 3import cgi 4import cgitb 5import os.path 6import html 7 8cgitb.enable 9 10FILE_LOG = "chat-log.txt" 11 12def print_html(body): 13 print("Content-Type:text/html; charset = UTF-8") 14 print("") 15 16 print(""" 17 <html> 18 <head> 19 <meta charset="UTF-8"> 20 <title>チャット</title> 21 </head> 22 <body> 23 <div> 24 <form> 25 名前:<input type="text" name="name" size = "8"> 26 本文:<input type="text" name="body" size = "20"> 27 <input type="submit" value="発言"> 28 <input type="hidden" name="mode" value = "write"> 29 </form> 30 </div> 31 <hr> 32 {0} 33 </body></html> 34 """.format(body)) 35 36def mode_read(form): 37 log = "" 38 if os.path.exists(FILE_LOG): 39 with open (FILE_LOG,"r",encoding='UTF-8') as f : 40 log = f.read() 41 print_html(log) 42 43def jump(url): 44 print("Status:301 Move Permanently") 45 print("Location:" + url) 46 print("") 47 print("<html><head>") 48 print('<meta http-equiv="refresh" content="0;'+url+'">') 49 print("</head><body>") 50 print("<a href ="'+url+'">jump</a></body></html>") 51 52def mode_write(form): 53 name = form.getvalue("name","no name") 54 body = form.getvalue("body","") 55 56 name = html.escape(name) 57 body = html.escape(body) 58 59 with open(FILE_LOG,"a+",encoding='UTF-8') as f: 60 f.write("<p>{0}:{1}</p><hr>\n".format(name,body)) 61 jump("chat.py") 62 63def main(): 64 form = cgi.FieldStorage() 65 mode = form.getvalue("mode","read") 66 if mode == "read" : mode_read(form) 67 elif mode == "write" :mode_write(form) 68 else: mode_read(form) 69 70if __name__ == "__main__": 71 main() 72 73 74
試したこと
ブラウザ(Chrome)でShift-JISで読み込み直すと正しく表示されました。
ファイルの保存形式がおかしいのかと思ったのですが、UTF-8で保存されていることは確認しました。
書籍のサンプルコードが配布されておりそちらをダウンロードして試してみましたが同様の文字化けが起こりました。
WEBサーバはPythonにあるものを使用しています。
以下で立ち上げています。
-m http.server --cgi
ソースコード内やファイルの保存形式の他に文字コードを設定すべき場所があるのでしょうか?
補足情報(FW/ツールのバージョンなど)
Windows 10
Python 3.6.4
ブラウザ:Chrome 67.0.3396.79
※Firefox 60.02 でも同様の現象が起こりました。
使っているエディタ:visual studio code 1.24.0

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/12 11:57