質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

2回答

26460閲覧

Pythonにて文字化けが発生します

stak

総合スコア9

Python 3.x

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

0グッド

0クリップ

投稿2018/06/11 11:21

編集2018/06/12 02:58

前提・実現したいこと

「実践力を身につける 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Win10+IISでも再現しました。
CGI上での標準出力のエンコーディングsys.stdout.encodingを確認したところcp932になっていました。よってprint結果はcp932(shift-jis)で出力されてしまい、文字化けする結果となっています。

以下のようにutf-8に切り替えることでUTF-8で出力され正常に表示されるようになります。
参考:PythonのCGIで日本語が文字化けしたときの対処法

また、エラー発生時のトレース出力を有効にするにはcgitb.enable ではなく cgitb.enable()としてください。

Python

1# 略 2import html 3 4import sys,io 5sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # UTF-8に 6 7cgitb.enable() # トレース出力を有効に 8# 略

投稿2018/06/12 04:55

編集2018/06/12 05:49
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stak

2018/06/12 11:57

ありがとうございます! 教えていただいた方法で無事解決しました。
guest

0

【Python】htmlがweb上で表示されない。より

print("Content-Type:text/html; charset = UTF-8")

Python

1print("Content-Type: text/html; charset=utf-8")

もしくはPython3ファイルをHTMLで読み書きする際に文字化けする。

投稿2018/06/12 04:40

umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問