PythonでCGI書いてるんだが迷宮入りしたプログラミングweb助け

このエントリーをはてなブックマークに追加
1以下、名無しにかわりましてVIPがお送りします
pythonのcgiモジュールのFieldStorage()使って書いたんだが
ページにアクセスすると真っ白になる

CGIじゃなく直接Pythonで実行するとhtmlらしき文書が出てくる
そのしたにencodingerrorが出てくる
これなに助けて混乱してる
2以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:51:52.61 ID:MjnWB1fI0
cgiゲー面白いよね
3以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:52:12.99 ID:36GL0FGoP
apacheの設定じゃね?
4以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:52:55.06 ID:vZA8zyJ80
aspe
5以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:53:51.33 ID:dpyX/gRC0
>>3
テスト用のCGIは動いてるんだ
6以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:54:58.34 ID:49VZLIWy0
お前、HTTPのヘッダ出力してないだろ?
7以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:55:26.67 ID:OQtRqTdL0
>>6だな
8以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:55:54.53 ID:36GL0FGoP
>>5
ファイルかディレクトリの実行権限かな? python知らねーからテキトー言ってるけど。
9以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:57:48.04 ID:Nj/AEiwt0
テスト用のCGIはPython?
10以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:58:11.57 ID:+29bVYpS0
ライブラリが足りてないんじゃね
11以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 18:59:42.73 ID:dpyX/gRC0
>>6
Print('Content-type: text/html;charset=utf-8¥n')

がプリント文の一番最初なんだがフォーマット違ったりする?
12以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:00:15.41 ID:dpyX/gRC0
¥
13以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:00:56.46 ID:dpyX/gRC0
print('Content-type: text/html;charset=utf-8\n')
14以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:04:45.24 ID:49VZLIWy0
>>13
\n\n
15以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:05:26.06 ID:S8t0yzIM0
迷宮ゲームすでにしてるじゃん
16以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:06:35.09 ID:dpyX/gRC0
>>14
試してみる
17以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:06:49.98 ID:Nj/AEiwt0
改行はCR LF
18以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:07:19.72 ID:igBP7UF10
改行コード\r\nじゃないか?
しかもCGIの時ってヘッダ部の終了を表す空行入れないといけないから\r\n\r\nじゃね
19以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:08:55.61 ID:dpyX/gRC0
>>14
無理だった
20以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:10:11.80 ID:49VZLIWy0
>>19
マジか
俺はC++とgccでcgi書いてるけどこれで問題無いけどなー
21以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:11:33.30 ID:Ko+7zrOzP
むしろ改行コードっているわけ? printで改行されてるとか言うオチじゃないの?
と思ってドキュメントを調べたら

http://docs.python.jp/3/library/cgi.html
>print("Content-Type: text/html") # HTML is following
>print() # blank line, end of headers
22以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:11:44.48 ID:dpyX/gRC0
>>18
linuxなんで
23以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:12:03.68 ID:6C5IRfv1P
スタンドアローンアプリが書ける分PHPより汎用性高いよな
Linuxならまず実行環境入ってるし
24以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:12:15.72 ID:DcJldohI0
ジャンゴwwwwww
25以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:12:59.25 ID:I8ookjUt0
シフトJISにしてみ
26以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:13:44.38 ID:dpyX/gRC0
大事なこと忘れてた

Python3な
27以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:15:40.49 ID:dpyX/gRC0
>>21
無理だった
28以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:15:42.27 ID:49VZLIWy0
httpサーバーのエラーログには何も残ってないの?
29以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:15:48.42 ID:DcJldohI0
chmod 755 *(確信)
30以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:18:13.48 ID:dpyX/gRC0
>>29
違った
31以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:25:43.22 ID:dpyX/gRC0
>>28
[Sun Jan 19 19:19:40 2014] [error] [client ●●●.●●●.●.●●●] Traceback
(most recent call last):
[Sun Jan 19 19:19:40 2014] [error] [client ●●●.●●●.●.●●●] File
"/var/www/cgi-bin/●●●●.py", line 36, in <module>
[Sun Jan 19 19:19:40 2014] [error] [client ●●●.●●●.●.●●●]
print(html_body.format(content))
[Sun Jan 19 19:19:40 2014] [error] [client ●●●.●●●.●.●●●]
UnicodeEncodeError: 'ascii' codec can't encode characters in position
96-106: ordinal not in range(128)
32以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:32:25.05 ID:Ko+7zrOzP
ちなみにPythonのバージョンいくつよ
33以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:34:16.30 ID:49VZLIWy0
>>31
utf8でContent-type: text/htmlを出力しようとしてるからじゃね?
Pythonは良く知らないけど、;charset=utf-8いらないんじゃね?
34以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:35:49.54 ID:dpyX/gRC0
>>32
3.3
35以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:36:23.14 ID:dpyX/gRC0
>>33
違った
36以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:37:29.05 ID:Nj/AEiwt0
Python2のソースをコピペしてるわけじゃないんだよね?
37以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:42:14.96 ID:dpyX/gRC0
>>UnicodeEncodeError: 'ascii' codec can't encode characters in position
>>96-106: ordinal not in range(128)

96-106の部分にだけ日本語があるプログラムだった

'ascii' codec をuff-8 codec にすれば良いんだろうけどこの時はどのソフトがエンコードしようとしてるんだ?
38以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:42:20.29 ID:Ko+7zrOzP
Python3って文字列Unicodeだけになったんだっけか
デフォルトのエンコーディングutf-8じゃないんじゃねえの

これとか参考になんね?
http://stackoverflow.com/questions/9322410/set-encoding-in-python-3-cgi-scripts
39以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:44:59.57 ID:dpyX/gRC0
>>38
Unicode ニアリーイコール utf-8
40以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:47:57.60 ID:Ko+7zrOzP
>>39
全然ちげーよハゲ
Unicodeは文字の集合でUTF-8は文字の符号化方式だろうがハゲ
41以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:48:21.70 ID:n8FCUIND0
スレと関係ないんだけど、2chがVPN経由での書き込みを禁止するシステムを作ったらしいね

海外ホストに「!」をつける

海外ホストからの書き込み禁止

VPN禁止


これの意図するものはマジで1個しかない・・・
42以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:50:00.01 ID:2KLGo2yS0
筑波
43以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:50:25.72 ID:n8FCUIND0
そのせいかmechanizeで色々と2chBOT作ってたのに動かなくなっちゃったわ
一応まだ手段は残ってるけど
海外の本気の奴らがVPN経由の書き込み規制ごときでやめるわけないし
どの程度の効果があるのか
44以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:52:17.96 ID:n8FCUIND0
おそらく何らかの趣旨の書き込みを
日本のbbsから消し去りたいんだろうな

大規模規制やVPN禁止までやってもダメだったら
あとはNSAみたいに全部のPCを管理下に置く事やっていくしかない

winnyみたいな匿名ソフトが、日本政府に嫌われる理由とは
45以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:52:50.08 ID:dpyX/gRC0
>>40
Unicodeに準じた文字の符号化方式がutf-8で

Unicode使いたければutf-8使うことになるんだから全然違くはない
ニアリーイコールでしょ

ハゲとか暴言はいて自分の知ったかぶりをみえなくするのはやめてください
46以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:54:13.60 ID:igBP7UF10
UTF-16のことも思い出してあげてください
47以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 19:57:08.81 ID:n8FCUIND0
インターネットは警察などが介入できない領域であってほしいんだが
48以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:00:16.06 ID:Ko+7zrOzP
>>45
確かに違うものをニアリーイコールで片付けると
正確さを求められるプログラミングはできなくなる
UnicodeとUTF-8は魚と刺し身くらい違うぞ

Python3の文字列の変数はUnicode型でASCII以外の文字列も使っているのに
デフォルトのエンコーディングがASCIIになってるからバグってんだろうがよ
49以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:08:40.19 ID:igBP7UF10
昔Unicodeのことを符号化方式だと思ってた
UTF-16をUnicodeって書いてるメモ帳のせいで

しねM糞
50以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:10:54.82 ID:n8FCUIND0
なんで文字コード理解してないのにPythonでCGIなのかと
51以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:11:46.61 ID:irmZXFz80
>>41
去年VPN使った大規模な荒らしが流行ってアク禁になった
52以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:11:59.94 ID:n8FCUIND0
PerlもRubyもPythonも今はUTF-8に統一される動き
べつの文字コードでも動かせるけど
特に理由がないならやらない
53以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:13:49.89 ID:dpyX/gRC0
>>45

>>確かに違うものをニアリーイコールで片付けると
>>正確さを求められるプログラミングはできなくなる
ニアリーイコールはイコールとは違う
Unicodeとutf-8はノットイコールではないと思う

>>UnicodeとUTF-8は魚と刺し身くらい違うぞ
の例えは
http://d.hatena.ne.jp/tyru/touch/20091129/difference_between_unicode_and_utf8
からもってきたんだろ
54以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:14:41.70 ID:n8FCUIND0
そもそも分かっていないうちはマルチバイト文字使わずに
ローマ字だけ使ってプログラミングしていれば良い

マルチバイト文字を表示させるってOSからしたら
結構大変なことなんだ
転送量減らす為にUTF-8だってすべてが3バイトってわけじゃないし
1バイト〜6バイトくらいが混在してるんだっけ

ああ
55以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:18:05.00 ID:igBP7UF10
議論が逸れとる
ニアリーイコールというお互い定義が違う言葉を使うから咬み合わないんじゃん
UnicodeとUTF-8は関係があるっていう主張と違うものを一緒くたにするなっていう主張だろ?
どっちも正解だし本題に戻りなよ
56以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:18:55.46 ID:dpyX/gRC0
>>45
そしてお前は>>38
>>Python3って文字列Unicodeだけになったんだっけか
>>デフォルトのエンコーディングutf-8じゃないんじゃねえの

と言ってるがPython3のデフォルトのエンコードはutf-8だ
57以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:21:30.73 ID:n8FCUIND0
ダメだこいつ
58以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:21:45.47 ID:dpyX/gRC0
>>53>>56
>>48へのレスな
59以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:23:35.78 ID:igBP7UF10
今度は”デフォルトエンコーディング”の意味が咬み合っていなさそうな予感
60以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:26:42.13 ID:igBP7UF10
サーバのデフォルトエンコーディングの話とPythonのソースコードをUTF-8で書く話かな
61以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:32:50.24 ID:n8FCUIND0
まず
>>11のやつと
print 1
だけかいたCGI実行して表示されるかどうか試せよ
これで表示されないなら最初っからおかしい
62以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:34:14.42 ID:n8FCUIND0
半角の英数字は文字コード関係ないから

まずはそれでtestしてからマルチバイト
63以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:34:26.11 ID:muN0gCBC0
Python3の各エンコーディング用の関数の初期値がUTF-8になってるだけだよ

そしてstdoutのエンコーディングは、コンソールのコードページに依存する
http://docs.python.jp/3.3/library/sys.html#sys.stdin
そしてエンコーディングエラー処理の初期値は'strict'だから
エンコードできない文字に出会えば例外が送出される
ただそれだけ
64以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:36:04.79 ID:xrCZmjvU0
なんでPythonは後方互換性持たせなかったのかな?
65以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:36:15.30 ID:igBP7UF10
おおようやくPython3に詳しい識者登場
66以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:37:04.00 ID:n8FCUIND0
Pythonとかやったことないわ

他言語の知識で喋る
67以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:41:40.81 ID:dpyX/gRC0
>>61

#!/usr/bin/env python3.3
print('Content-type: text/html;charset=utf-8\n')
print(1)

で動いた
68以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:44:31.63 ID:n8FCUIND0
>>67
そしたらそのソースコード書いてるファイルの文字コードをUTF-8で保存して
"あ"

とか表示させられればok
69以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:50:03.79 ID:dpyX/gRC0
>>68
真っ白なページになった
70以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:51:34.72 ID:n8FCUIND0
>>69
ブラウザのメニューバーのとこで
表示 → エンコード → UTF-8

って選択されてる?
71以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:52:03.18 ID:xrCZmjvU0
>>67
pythonよくわからないけど
#!/usr/local/bin/python3.3
とかじゃないの?
72以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:53:57.12 ID:igBP7UF10
>>63にこう書いてある

> stdout は print() および expression 文の出力と、input() のプロンプトに使用されます。
> ・・・
>デフォルトでは、これらストリームは open() 関数で返された一般テキストストリームです。パラメータは以下から選ばれます:
>The character encoding is platform-dependent. Under Windows,
>if the stream is interactive (that is, if its isatty() method returns True),
>the console codepage is used, otherwise the ANSI code page. Under other platforms, the locale encoding is used (see locale.getpreferredencoding()).
>ただし、すべてのプラットフォームにおいて、環境変数 PYTHONIOENCODING に設定した値でこの設定を上書きできます。

ということはつまりシステムロケールのエンコーディングをutf-8で指定するか
PYTHONIOENCODINGを指定すればOK?
>>1の環境はデフォでUSになってるからASCIIってこと?
73以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:57:43.90 ID:dpyX/gRC0
>>69の時の
サーバーのerror_logはこれ

[Sun Jan 19 19:19:40 2014] [error] [client ●●●.●●●.●.●●●] Traceback
(most recent call last):
[Sun Jan 19 19:19:40 2014] [error] [client ●●●.●●●.●.●●●] File
"/var/www/cgi-bin/●●●●.py", line 36, in <module>
[Sun Jan 19 19:19:40 2014] [error] [client ●●●.●●●.●.●●●]
print(html_body.format(content))
[Sun Jan 19 19:19:40 2014] [error] [client ●●●.●●●.●.●●●]
UnicodeEncodeError: 'ascii' codec can't encode characters in position
96-106: ordinal not in range(128)
74以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:58:11.32 ID:VVkGLMQeP
75以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:58:29.90 ID:igBP7UF10
locale.getpreferredencoding = lambda: 'UTF-8'

もしくはこれを頭に書いときゃいける?
76以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 20:59:42.28 ID:dpyX/gRC0
>>73
は間違い

#!/usr/bin/env python3.3
print('Content-type: text/html;charset=utf-8\n')
print('あ')
でこのエラー

[Sun Jan 19 20:52:51 2014] [error] [client ●●●.●●●.●.●●●] Traceback
(most recent call last):
[Sun Jan 19 20:52:51 2014] [error] [client ●●●.●●●.●.●●●] File
"/var/www/cgi-bin/●●●●.py", line 3, in <module>
[Sun Jan 19 20:52:51 2014] [error] [client ●●●.●●●.●.●●●] print('\
\u3042')
[Sun Jan 19 20:52:51 2014] [error] [client ●●●.●●●.●.●●●]
UnicodeEncodeError: 'ascii' codec can't encode character '\\u3042' in
position 0: ordinal not in range(128)
77以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:00:15.94 ID:k7o0WIDv0
最少コードで動かして何が原因か探っていってみなよ
78以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:01:13.40 ID:n8FCUIND0
asciiに変換しようとしたらユニコードでしたって言われてるっぽい?

Pythonにもソースコードにマジックコメント書くんだっけ
79以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:03:18.10 ID:n8FCUIND0
#!/usr/bin/env python3.3
# -*- coding: UTF-8 -*-
print('Content-type: text/html;charset=utf-8\n')
print('あ')


これで無理?
80以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:03:31.86 ID:dpyX/gRC0
>>70
されてる
81以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:04:53.33 ID:igBP7UF10
print(1)の代わりに

print(sys.getdefaultencoding())
print(sys.stdout.encoding)

この2つ出力してみたらどっちかasciiになってるんじゃないかな
82以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:06:39.94 ID:dpyX/gRC0
>>79
無理
83以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:07:49.26 ID:k7o0WIDv0
文字コード何で保存してんの?
84以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:07:55.67 ID:xrCZmjvU0
>>79
これはエディタにこのファイルはutf-8だって伝えているだけかも
85以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:11:11.56 ID:igBP7UF10
-*- みたいな表記はEmacs用のおまじないのコメントじゃなかったっけ?
std.outのエンコーディングが問題なので関係ないかと
86以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:11:42.48 ID:dpyX/gRC0
>>81
utf-8 ANSI_x3.4-1968
87以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:13:09.03 ID:k7o0WIDv0
それ日本語使えなくね?
88以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:15:31.44 ID:n8FCUIND0
http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html

なんかこの辺でかいてるのが同じ種類のエラーのような気がするけど
Pythonって日本語表示させるだけでこんな大変なの
89以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:16:52.15 ID:igBP7UF10
Linuxのシステムロケールの設定がLANG=Cになってそうな感じするね
LANG=ja_JP.utf-8に変えるか環境変数PYTHONIOENCODING をutf-8に設定するかしてみてよ

ソースコード上で解決するなら>>75かもしくは

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

でどうだろ
90以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:17:46.59 ID:tITHuPwR0
# coding: utf-8
import sys
...
sys.stdout.buffer.write("あいうえお".encode("utf-8"))
91以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:17:55.78 ID:n8FCUIND0
print('あ'.encode('utf_8'))

これ無理?
92以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:18:17.34 ID:k7o0WIDv0
このあたりの全部試せば治るな

ttp://doloopwhile.hatenablog.com/entry/20111225/1324822224
93以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:18:19.65 ID:dpyX/gRC0
>>81
これは
import sys
をしてから使いましょう
94以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:18:23.45 ID:mm3LF58T0
ラテン系以外の言葉は人間の言葉じゃないからだよ、猿
95以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:19:56.23 ID:+tH4DsoY0
#!/usr/bin/perl

print "Content-type: text/html\n\nあ";
96以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:20:20.37 ID:k7o0WIDv0
パールでやるのかよw
97以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:20:50.85 ID:+tH4DsoY0
perl舐めんなよ
98以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:20:51.41 ID:igBP7UF10
>>95
天才あらわる
99以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:21:30.33 ID:k7o0WIDv0
これぐらいで引っかかるならパールの方が早いか
100以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:23:21.99 ID:igBP7UF10
ここに載ってるapacheからCGIに環境変数渡す方法でもいけそう

ttp://blog.straight-spirits.co.jp/archives/201308/273/
101以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:27:43.28 ID:dpyX/gRC0
>>81
sshでサーバーのPythonコンソール使うと
>>>import sys
>>>print(sys.getdefaultencoding())
>>>utf-8
>>>print(sys.stdout.encoding)
>>>UTF-8

何だけど
>>81だと
>>86
なんだよ

ANSI_X3.4-1968って多分ASCII関係だよな
102以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:28:34.19 ID:dpyX/gRC0
>>101
cgi通すとASCIIが出てくるのか
103以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:30:30.10 ID:igBP7UF10
ApacheからCGIとしてプロセス起動した時に変えられてるってことか
複雑怪奇やね\(^o^)/
104以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:31:14.26 ID:8wT/kVhz0
やっぱり>>89しかないんじゃね?
105以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:32:02.45 ID:dpyX/gRC0
>>88
Python3からは標準でutf-8だからローカルでは気にせずに日本語使えてた
Pythonさんは悪くないです
僕が悪いんです
106以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:33:47.80 ID:igBP7UF10
Python3になってマルチバイトの取り扱いが楽になるという噂は嘘だったのか
それともPython2はもっと大変だったのか
107以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:35:19.16 ID:k7o0WIDv0
どんなサーバ環境で使ってるんだ
108以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:36:01.00 ID:igBP7UF10
109以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:42:04.66 ID:dpyX/gRC0
>>89
システムロケールは全部
ja_JP.UTF8
でした
110以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:45:01.28 ID:14Jqn0zQ0
pythonでcgiやるとこんなに不幸で大変なのかやはりphpは正義だった
111以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:46:07.67 ID:dpyX/gRC0
>>76
のエラーの中の
\u3042
はユニコードの'あ'

どこの誰がこれをASCIIでエンコードしようとしてるんだ?
112以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:46:35.82 ID:mm3sFnvC0
CGIがもうオワコンだよな
書籍もないし
113以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:50:44.31 ID:k7o0WIDv0
@ApacheがCGI要求 ⇒ APythonコード ⇒ Bpython.exe実行 ⇒ CHTML生成 ⇒ DApacheで返す

Bでエラーはいてるんだからapacheの
問題じゃなくてpythonの標準出力の文字コードの問題?
114以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:51:03.70 ID:igBP7UF10
Apacheさんのconfに
SetEnv PYTHONIOENCODING utf8
の一行をつっこむ
115以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:53:11.70 ID:dpyX/gRC0
>>91
b'\xe3\x81\x82'
ってでた
116以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:54:09.86 ID:14Jqn0zQ0
>>113
わしpython使わんからよーわからんけど蛇よりcgiとかアパッチの設定のよーな、、

何かデフォの設定って何故か後で切り替えても切り替わらないパターンってたまに起こるからトラウマ
117以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:54:24.26 ID:igBP7UF10
>>113
コンソールなら問題ない>>101>>105らしいよ
cgiが絡むと事情が変わってる
118以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:58:40.30 ID:igBP7UF10
>>116
どこがどうなってるかよくわからんのでひと通りデーモンを再起動させてみる
 →設定変えたせいで起動しなくなった/(^o^)\
これが最高にトラウマ
119以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 21:59:59.33 ID:igBP7UF10
そういやapacheで話進めてるけどwebサーバはapacheだよね?
120以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:03:48.22 ID:dpyX/gRC0
>>119
そうだよ
121以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:09:06.52 ID:igBP7UF10
PYTHONIOENCODING 設定しても無理そう?
122以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:09:50.06 ID:k7o0WIDv0
アパッチの問題ならpythonのcgiサーバなら動くってことか?
123以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:14:42.25 ID:dpyX/gRC0
進 展 が な い
解 決 し て い な い
124以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:15:33.15 ID:dpyX/gRC0
>>121
>>122
どうやんの?
125以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:18:07.72 ID:JCaJP0OT0
<Directory "/oma/e/no/basho/">
Options ExecCGI
AddHandler cgi-script .py
SetEnv LANG ja_JP.UTF-8
</Directory>
126以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:18:23.38 ID:k7o0WIDv0
>>124
ここにCGIサーバの立て方のってるけど
問題の切り分けも自分でできなくて、今って開発環境の構築ができてないってことだよね
素直に他のに乗り換えた方が早いとおもうんだけどなぁ・・・

ttp://d.hatena.ne.jp/uriyuri/20081024/1224839381
127以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:21:08.61 ID:igBP7UF10
>>124
apacheのhttpd.confに>>114突っ込むか

もしくは>>125みたいにCGIの設定してる部分にSetEnv LANG〜の行を突っ込む
128以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:25:16.09 ID:igBP7UF10
もちろんapacheの再起動は必要
129以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:28:02.60 ID:dpyX/gRC0
apacheのエラーログの仕組み教えて
130以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:28:51.97 ID:dpyX/gRC0
なんの解決もしてない
131以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:29:03.76 ID:tITHuPwR0
>>90 は試したの?
132以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:29:46.72 ID:k7o0WIDv0
そもそもアパッチでCGIは動くように設定してあるのかよww
133以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:30:22.43 ID:igBP7UF10
マルチバイト使わなきゃ動くって話なので多分
134以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:31:09.98 ID:dpyX/gRC0
>>131
...も書くのか?
135以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:31:24.44 ID:igBP7UF10
>>129
なんでエラーログの話になったんだ……
136以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:33:08.26 ID:tITHuPwR0
>>134
書かない
... は省略って意味
137以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:33:11.03 ID:dpyX/gRC0
>>135
エラーログの仕組みわかればどの時点でasciiでエンコードしようとしてるのかわかるだろ
138以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:35:28.67 ID:dpyX/gRC0
>>136
ヘッダを省略したんだよな?
139以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:35:59.01 ID:igBP7UF10
>>137
Apacheのとこで原因切り分けるだけなら>>126の言うとおりPythonのCGI鯖使いなよ……
140以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:37:28.91 ID:tITHuPwR0
>>138
そういうこと。やってみて
やったらスクリプト全部貼って
141以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:39:15.13 ID:mm3sFnvC0
流し読みしただけだけどいまいち状況がわからない
142以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:39:41.70 ID:dpyX/gRC0
>>139

>>126のリンク先はPython2.4での話だから

Python3のドキュメントではCGIHTTPServerが
143以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:42:24.09 ID:muN0gCBC0
レスポンスヘッダも要るのかな

#!/usr/bin/env python3.3
# -*- coding: UTF-8 -*-
import sys
import io
buf = sys.stdout.buffer
sys.stdout.detach()
sys.stdout = io.TextIOWrapper(buf, encoding='utf-8', newline='')
print('Content-type: text/plain; charset=UTF-8\n\n')
print('あいうえお')
sys.stdout.flush()
144以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:46:32.79 ID:k7o0WIDv0
python3はこっちか

import http.server
http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)
145以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:46:41.42 ID:dpyX/gRC0
>>140
#!/usr/bin/env python3.3
# cosing: utf-8
import sys
print('Content-type: text/html;charset=utf-8\n')
sys.stdout.buffer.write("あいうえお".encode("utf-8"))

だと真っ白

#!/usr/bin/env python3.3
# cosing: utf-8
import sys
print('Content-type: text/html;charset=utf-8\n')
print(sys.stdout.buffer.write("あいうえお".encode("utf-8")))

だと
15
ってでた
146以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:48:36.43 ID:igBP7UF10
先にdetach()が要るのか・・・

>>142
>>143で解決されそうだけど一応
どうせライブラリの名前変わっただけで似たようなのあるでしょ?
147以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:49:00.19 ID:dpyX/gRC0
>>145
# coding: utf-8
でもだめ
148以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:53:43.87 ID:tITHuPwR0
>>145
15 は write() したバイトの数
これなら動く?

#!/usr/bin/env python3.3
# coding: utf-8
import sys

result = "Content-type: text/html;charset=utf-8\n\n"
result += "<h1>あいうえお</h1>"
sys.stdout.buffer.write(result.encoding("utf-8"))
149以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:54:22.69 ID:tITHuPwR0
ああっと。sys.stdout.buffer.write(result.encode("utf-8")) の間違い
150以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 22:57:39.99 ID:dpyX/gRC0
>>143
これやったら

あいうえお
って、でた

おれは意味もわからずやってるから使い方知らないけど
今までので設定変えるコードとかあった?
151以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 23:04:44.93 ID:dpyX/gRC0
>>148
太くてでかい文字で

あいうえお

ってでた
152以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 23:06:33.39 ID:dpyX/gRC0
結局なんだったの?
153以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 23:12:38.70 ID:igBP7UF10
>>90で正解出てたんじゃん
やっぱ知ってる奴に任せるのが一番だな
154以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 23:17:23.84 ID:dpyX/gRC0
>>153
なんだったの?
155以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 23:18:17.02 ID:pU1ykkOP0
おっ.pyと聞いて
156以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 23:20:42.69 ID:igBP7UF10
>>63にあるように標準出力のエンコーディングがutf-8ではなかったので

>>143はprint関数が利用する標準出力をエンコーディングがutf-8の設定で作りなおしてる
>>90,148のやり方は文字列をutf-8でエンコードしたバイト列を標準出力のバッファにそのまま渡しちまえという感じ

Pythonようわからんけど
157以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 23:25:32.18 ID:mm3sFnvC0
マルチバイト文字で発狂したくなる気持ちはわかる
158以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 23:27:49.67 ID:dpyX/gRC0
>>156

>>101
みたいにローカルだと標準出力のエンコーディングがutf-8なのに
cgi使うとASCIIになるのはなぜ?
159以下、名無しにかわりましてVIPがお送りします:2014/01/19(日) 23:35:11.62 ID:igBP7UF10
>>158
それは知らんなApacheが原因かどうかは切り分けて調べてくれ
Pythonのhttp.serverモジュール(?)でCGI動かして標準出力のエンコーディングがちゃんとutf-8になるならApacheが悪い

俺がこのスレで得た乏しい知識から推察するに
Apache経由でPythonのプロセス起動した時に
システムロケールの設定と違う環境変数渡してるとかそんな感じじゃないの
160以下、名無しにかわりましてVIPがお送りします
Pythonが流行らないわけだな