お世話になってます。
拙い質問で恐縮ですが、どうぞよろしくお願いいたします。
実現したいこと
ウェブブラウザで入力した日本語を含む情報をテキストファイルに保存したい。
python3.7 CGIで作っています。
詰まっていること
まず、テキストファイルに日本語の文字列が保存されませんでした。アルファベット数字は保存されます。その際のエラーメッセージです。
savedata.write(str)\r\nUnicodeEncodeError: 'cp932' codec can't encode character '\ufffd' in position 0: illegal multibyte sequence\r\n'
その後、エラーから同様のケースを探して、以下の参照先URLと同様にopen実行時にUTF-8に明示的にエンコードしてみたところ、次は保存したファイル中で日本語の文字列が文字化けするようになりました。
「・ス・ス・ス{・ス黷ェ・ス・ス・ス・ス・ス・ス・ス・ス」のような化け方です
https://ja.stackoverflow.com/questions/34431/python-%E3%82%A8%E3%83%A9%E3%83%BCcp932-codec-cant-encode-character
先日もこちらで文字化けについて教えていただいたばかりで、こちらも同様のやり方で、と思ったのですがうまくいきません。
https://teratail.com/questions/227660
どうぞよろしくお願いいたします。
コード
画面遷移は次の通りです。
入力画面 index.html
↓
確認画面 input.py
↓
完了画面 save.py
html
1#index.html 入力画面 2 3<!DOCTYPE html> 4<html lang="ja"> 5<head> 6<meta charset=utf-8 /> 7</head> 8<body> 9<p><入力></p> 10 <form action="cgi-bin/input.py" method="post"> 11 <p>社員番号</p> 12 <input type="text" name="index"></textarea> 13 <p>社員名</p> 14 <input type="text" name="user"></textarea> 15 <p>内容</p> 16 <textarea name="text" rows="6" cols="60"></textarea> 17 <input type="submit" /> 18 </form> 19<br/> 20<p>入力したデータを読み込む</p> 21 <form action="cgi-bin/load.py" method="post" enctype="multipart/form-data"> 22 <input type="file" name="fname" /> 23 <input type="submit" /> 24 </form> 25</body> 26</html>
python
1#input.py 確認画面 2 3# -*- coding: utf-8 -*- 4 5html = """ Content-Type:text/html 6 7<html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html" /> 10 </head> 11<body> 12<form action="save.py" method="GET"> 13 <p>社員番号</p> 14 <input type="text" readonly="readonly" name="userdata" value="{}" /> 15 <p>ユーザー名</p> 16 <input type="text" readonly="readonly" name="userdata" value="{}" /> 17 <p>内容</p> 18 <input type="text" readonly="readonly" name="userdata" value="{}" /> 19 <p>この内容で保存する?</P> 20 <input type="submit" /> 21<form> 22</body> 23</html> 24""" 25import cgi 26import cgitb 27cgitb.enable() 28 29f = cgi.FieldStorage() 30i = f.getvalue("index") 31u = f.getvalue("user") 32t = f.getvalue("text") 33print(html.format(i,u,t))
python
1#save.py 完了画面 2 3# -*- coding: utf-8 -*- 4 5 6html = """Content-Type:text/html 7 8<html> 9<head> 10</head> 11<body> 12完了しました 13</body> 14</html> 15""" 16import cgi 17import cgitb 18cgitb.enable() 19 20f = cgi.FieldStorage() 21 22userdata = f.getlist("userdata") 23savedata = open("user/1211.txt",mode="w",encoding="utf-8") 24#ファイル名に入力した情報をつけたいので次のようにしてみたが、こちらも日本語だとファイル名が文字化けしてしまう。 25#savedata = open("user/{}.txt".format(userdata[1]),mode="w",encoding="utf-8") 26for str in userdata: 27 savedata.write(str) 28savedata.close() 29print(html) 30