🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1096閲覧

ウェブブラウザで入力した日本語を含む情報をテキストファイルに保存したい

tonk

総合スコア22

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/11 02:16

編集2019/12/16 21:35

お世話になってます。
拙い質問で恐縮ですが、どうぞよろしくお願いいたします。

実現したいこと

ウェブブラウザで入力した日本語を含む情報をテキストファイルに保存したい。
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

追記

該当のファイルをバイナリエディタで開いてみたところです。
イメージ説明

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

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

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

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

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

pepperleaf

2019/12/14 01:45

> 保存したファイル中で日本語の文字列が文字化け って書かれていますが、そのファイルは、UTF-8として開いていますか? 何で見て、文字化けと判断したのでしょう?
tonk

2019/12/15 21:22

ありがとうございます。 上記のコードにあるように、openを実行した際にUTF-8として開いています。 保存したファイルを開いても、UTF-8で保存されていることを確認しています。
pepperleaf

2019/12/16 13:00

文字の化け方からして、SJisぽっい化け方なきがするのですが、、。 保存されたファイルをバイナルでみれれは、はっきりします。
pepperleaf

2019/12/16 23:15

元の文字コードが違っているみたいです。 U+FFFD --> Unicodeとして変換しようとして、失敗した.. って事のようです。ちょっと時間がソースまで、追えてないですが、情報まで。
tonk

2019/12/19 21:58

ありがとうございました。 Unicode変換はpython側でやってくれるのかと思ってましたが、違うのでしょうかね?
guest

回答1

0

windowsで開発を進めているとcp932でのエラーはよく遭遇します.

文字列のencode-decodeの方式がOSごとに異なるため発生します.

原因・理由を詳しく知りたければ,次のページを見ると良いと思います.
https://qiita.com/butada/items/33db39ced989c2ebf644

ignoreをしない方法であれば,codecsなどを使って,回避していた記憶があります.

このあたりは参考になると思います.
https://qiita.com/nskydiving/items/c900c27042bcd11517ee

投稿2019/12/17 00:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tonk

2019/12/19 21:57

ご回答ありがとうございました。 リンク先のcodecsでも解消せず、様々なHPで説明されているやり方を当たってみましたが、私の理解が浅いためかいずれも有効でなく、万策尽きた感じです。 そもそも文字コードをちゃんと理解しないまま、解決策だけを求めるのも違うのかなという思いも出てきました。また、チャレンジしてみたいと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問