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

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

新規登録して質問してみよう
ただいま回答率
85.51%
POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python 3.x

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

4901閲覧

python3で文字化け

bsan

総合スコア24

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python 3.x

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2017/08/15 11:18

python3でHTMLのフォームに入力した内容をPOSTして表示させようとしています。半角英数字だと正常に表示されるのですが、日本語や大文字だと文字化けしてしまいます。エンコード絡みだと思うのですが、解決の糸口が見つかりません。解決策をご教授願えないでしょうか。

入力結果

■■■ソース 入力用プログラム edit.py■■■ #!/usr/bin/env python3 # -*- coding: utf-8 -*- import cgi import html import sqlite3 import urllib # DB接続 conn = sqlite3.connect('repairs.db') # Cursor オブジェクトでリストデータとして一括で読み取り cur = conn.cursor() # execute でクエリ実行 cur.execute('SELECT * FROM tasks') results = cur.fetchall() # resultsに二次配列としてDB結果が格納される # 配列の要素数取得 print(len(results)) # 行の数 print(len(results[0])) # 列の数 0行目の要素数を持ってくる pythonは列の要素数が一致しなくても良い title = "{} {} {} 詳細".format(results[0][2],results[0][3],results[0][5]) # TOP一覧 HTML print('Content-type: text/html') print('') print('<!DOCTYPE html>') print('<html lang="ja">') print('<head>') print('<title>入力フォーム</title>') print('<style type="text/css">') print('h1{background-color:#EEEEEE;border-bottom:1px solid #4C4C4C;border-top:2px solid #4C4C4C;color:#0000DD;font-size:16px;margin: 5 0 5 0;padding: 5px;}') print('table{border-collapse:collapse;}') print('table,th,tr,td {border:1px solid #808080;}') print('table,th,tr,td {padding:6px;table-layout:fixed;}') print('td.ttd {background-color:#dcdcdc;width:100px;}') print('td.ntd {width:200px;}') print('td.std {width:600px;min-height:50px;}') print('th.tht {background-color:#dcdcdc;width:150px;font-weight: normal;}') print('td.itd {width:200px;padding:3px;}') print('input[type=text] {width:200px;height:20px;font-size:16px;}') print('</style>') print('</head>') print('<body>') print('<h1>POSTテスト</h1>') print('<form name="Form" method="POST" action="http://localhost:8080/cgi-bin/posttest.py">') print('<input type="text" name="id" value="テスト">') print('<input type="text" name="estno" value="入力">') print('<div align="center"><input type="submit" value="確認画面へ"></div></form>') print('</body>') print('</html>') cur.close() conn.close() ■■■ソース 出力用プログラム posttest.py■■■ #!/usr/bin/env python3 # -*- coding: utf-8 -*- import cgi import html import sqlite3 import urllib import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') form = cgi.FieldStorage() no = form.getvalue('id','') estno = form.getvalue('estno','') print('Content-type: text/html; charset=UTF-8\r\n') print('') print('<!DOCTYPE html>') print('<html lang="ja">') print('<body>') print('<h1>入力結果</h1>') print(no) print(estno) print('</body>') print('</html>')

###補足情報(言語/FW/ツール等のバージョンなど)
言語:python3
Windows7Pro32bitのクライアントで開発しています
Atomで作成中です。
Atomの環境はUTF-8です。

よろしくお願いします。

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

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

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

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

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

tell_k

2017/08/15 16:37 編集

edit.py の 「print('Content-type: text/html')」はあってますか? 私の手元では、レスポンスヘッダーとして認識できないので、入力画面が真っ白になりました
bsan

2017/08/16 07:32

print('Content-type: text/html')」のままで、私の環境では画面が表示されます。私が無知で申し訳ないのですが、この部分はどのように記載するのがよろしいでしょうか。質問がそれてしまい申し訳ございません。
Lhankor_Mhy

2017/08/17 12:06

あまり詳しくないのですが、sys.stdinはラッピングしなくていいんでしょうか?
bsan

2017/08/17 18:39

sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')を追加して試してみましたが、文字化けしたままでした。
Lhankor_Mhy

2017/08/18 07:22

content-typeヘッダの改行を除去するとどうなりますか?
bsan

2017/08/20 00:59

content-typeヘッダの改行を除去でも文字化けしたままでした。
guest

回答1

0

自己解決

自己解決しました。
コメントいただいたみなさん、ありがとうございます。

「ソース 入力用プログラム edit.py」の以下を修正したら解消しました。

POSTしているform部分に「accept-charset="UTF-8"」を追加して文字エンコーディングを指定しました。

<form name="Form" method="POST" action="http://localhost:8080/cgi-bin/posttest.py"> ↓ <form name="Form" accept-charset="UTF-8" method="POST" action="http://localhost:8080/cgi-bin/posttest.py">

投稿2017/08/20 01:03

bsan

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問