質問編集履歴

1 説明不足の点を追記しました。

stak

stak score 7

2018/06/12 11:58  投稿

Pythonにて文字化けが発生します
### 前提・実現したいこと
Chapter5-3にあるチャットアプリを作成したのですが、ブラウザで表示すると文字化けしてしまいます。
書籍の中にあるサンプルコードを写経して(Chapter5-3にあるものです)WEBのチャットアプリを作成したのですが、WEBブラウザで表示すると文字化けしてしまいます。
ソースコード内ではUTF-8を指定しており、かつファイルもUTF-8で保存していますが、WEBブラウザからですと文字化けてしまいます。
### 発生している問題・エラーメッセージ
本来出力されるはずの文字
```
名前:
本文:
```
表示される文字
```
���O�F
�{���F
```
### 該当のソースコード
```Python
#!/usr/bin/env python
import cgi
import cgitb
import os.path
import html
cgitb.enable
FILE_LOG = "chat-log.txt"
def print_html(body):
   print("Content-Type:text/html; charset = UTF-8")
   print("")
   print("""
   <html>
   <head>
   <meta charset="UTF-8">
   <title>チャット</title>
   </head>
   <body>
   <div>
   <form>
   名前:<input type="text" name="name" size = "8">
   本文:<input type="text" name="body" size = "20">
   <input type="submit" value="発言">
   <input type="hidden" name="mode" value = "write">
   </form>
   </div>
   <hr>
   {0}
   </body></html>
   """.format(body))
def mode_read(form):
   log = ""
   if os.path.exists(FILE_LOG):
       with open (FILE_LOG,"r",encoding='UTF-8') as f :
           log = f.read()
   print_html(log)
def jump(url):
   print("Status:301 Move Permanently")
   print("Location:" + url)
   print("")
   print("<html><head>")
   print('<meta http-equiv="refresh" content="0;'+url+'">')
   print("</head><body>")
   print("<a href ="'+url+'">jump</a></body></html>")
def mode_write(form):
   name = form.getvalue("name","no name")
   body = form.getvalue("body","")
   
   name = html.escape(name)
   body = html.escape(body)
   with open(FILE_LOG,"a+",encoding='UTF-8') as f:
       f.write("<p>{0}:{1}</p><hr>\n".format(name,body))
   jump("chat.py")
def main():
   form = cgi.FieldStorage()
   mode = form.getvalue("mode","read")
   if mode == "read" : mode_read(form)
   elif mode == "write" :mode_write(form)
   else: mode_read(form)
if __name__ == "__main__":
   main()
```
### 試したこと
ブラウザ(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
  • Python 3.x

    14251 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る