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

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

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

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

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Python

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

Q&A

2回答

1456閲覧

さくらのサーバーでCGIを動かしたい

sho_00

総合スコア4

CGI

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

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Python

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

1グッド

0クリップ

投稿2021/09/27 06:36

さくらのサーバーで日本語表記

さくらのサーバーで日本語表記にしたいのですが、エラーが出てきてどうしようもありません
どなたか解決方法を教えていただきたいです。

発生している問題・エラーメッセージ

[cgi:error] AH01215: suexec policy violation: see suexec log for more details [cgi:error] End of script output before headers: nihongo.cgi

該当のソースコード

CGI

1#!/usr/local/bin/python 2 3import sys 4sys.stdin = open(sys.stdin.fileno(), 'r', 5 encoding='UTF-8') 6sys.stdout = open(sys.stdout.fileno(), 'w', 7 encoding='UTF-8') 8sys.stderr = open(sys.stderr.fileno(), 'w', 9 encoding='UTF-8') 10 11print("Content-Type: text/html; charset=UTF-8") 12print("") 13 14print("<html><body><h1>") 15print("賢い子は父親を喜ばせ,愚かな子は母親を悲しませる。") 16print("</h1></body></html>")

試したこと

文字種をUTF-8に変更
改行をCRに変更
パーミッションを705に変更

KojiDoiを押しています

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

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

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

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

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

itagagaki

2021/09/27 06:41

日本語じゃなければできているってことですか?
sho_00

2021/09/27 07:32

下記は問題無く動いています ``` #!/usr/local/bin/python print("Content-Type: text/html; charset=UTF-8") print("") print("Hello, World!") ```
guest

回答2

0

自分が使っているさくらのインターネットでは、以下のようにすれば動きました。

python

1#!/usr/local/bin/python 2# coding: utf-8 3 4import sys 5#sys.stdin = open(sys.stdin.fileno(), 'r', 6# encoding='UTF-8') 7#sys.stdout = open(sys.stdout.fileno(), 'w', 8# encoding='UTF-8') 9#sys.stderr = open(sys.stderr.fileno(), 'w', 10# encoding='UTF-8') 11 12print("Content-Type: text/html; charset=UTF-8") 13print("") 14 15print("<html><body><h1>") 16print("賢い子は父親を喜ばせ,愚かな子は母親を悲しませる。") 17print("</h1></body></html>")

まず、「このソースコードは『UTF-8』で書かれています」ということを示すために、「# coding: utf-8」というコメントを記述してください。(BOMがなくても問題ありません)

また、open関数にファイルディスクリプタを渡すことは知らなかったのですが、マニュアルを見る限りpython3にはその記述がありますが、python2にはその記述がありません。

ここでもエラーが発生しますので、コメントアウトしました。
(まぁもっとも、文字コードの問題で試しに入れてみただけかもしれませんが)

投稿2021/09/27 10:22

katsuko

総合スコア3538

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

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

sho_00

2021/09/27 11:00

ありがとうございます。本当に、本当に助かりました。 これで勉強を進められます。 最後に一つだけご教示いただきたいのですが、 CGIでは、# coding: utf-8がコメントアウトされないのはなぜなのでしょうか? 素人目にはコメントアウトされそうなのですが…
katsuko

2021/09/27 11:35

# coding: utf-8はコメントですよ。実行文ではありません。 pythonは、まず実行する前にソースコードの解析を行いますが、その際に「ソースコードの何処かに」「# coding: 」というコメントの記述があれば、回答のような処理をします。 まぁ、あまり深く考えずに、「# coding: 」というコメントを入れておくと、ソースコードの文字コードが指定できる、と覚えておけばいいと思います。
sho_00

2021/09/27 11:53

ありがとうございます。とてもよくわかりました。 実行コードではなく、一番最初の改行まで(いわゆるヘッダー?)までを確認し、 そこにある指示?にシステムが従うような感じなのですね。
etherbeg

2021/09/27 12:53

Pythonの仕様で、ソースファイルの「1行目もしくは2行目」に、所定の書式に従った記述がある場合、それはソースコードのエンコーディング指定であると解釈されるようになっています。たとえば次のようなものが「所定の書式」に沿った記述です。 # coding=<encoding name> # -*- coding: <encoding name> -*- # vim: set fileencoding=<encoding name> :
katsuko

2021/09/27 12:58

> etherbegさん あれ、どこでもいいんじゃないの?と思って最後に書いてみたら、確かにエラーになりますね。フォローありがとうございます。 前にファイル後尾に書いた覚えがあったのだけど、気のせいかしら。
guest

0

原因がわかりました。
さくらのサーバーのPythonにUTF-8のファイルを正しく処理させるにはBOM付きでないといけないようです。
ではnihonto.cgiをBOM付きUTF-8にすればいいかというと、そうすると今度はシェバンが正しく認識されなくなってしまいます。

回避策ですが、日本語を含むPythonスクリプトを別ファイルにしてimportすることで回避できました。

% file test.cgi test.cgi: Python script, ASCII text executable % cat test.cgi #!/usr/local/bin/python import nihongo nihongo.main() % file nihongo.py nihongo.py: HTML document, UTF-8 Unicode (with BOM) text % cat nihongo.py def main(): print('''Content-Type: text/html; charset=UTF-8 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> 賢い子は父親を喜ばせ,愚かな子は母親を悲しませる。 </body> </html> ''')

投稿2021/09/27 08:37

itagagaki

総合スコア8402

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

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

sho_00

2021/09/27 09:30

ご回答ありがとうございます。すみません、なにぶん初めてなもので。。。 test.cgi nihongo.dgi を作成し、textも。cgiで作成すればよろしいでしょうか? ここまで大変だとは思いませんでした。 さくらのサーバーはpythonでWebを作成するには向かないのでしょうか?
itagagaki

2021/09/27 09:50

importするファイルは nihongo.py とかじゃないとimportできないと思います。 Pythonのバージョンも2ですしね… 自分でPython3をインストールしてそっちを起動させることも不可能ではないと思いますが。
sho_00

2021/09/27 10:15

理解が悪くて申し訳ないのですが、 ①test.cgi test.cgi: Python script, ASCII text executable ②nihongo.py nihongo.py: HTML document, UTF-8 Unicode (with BOM) text ③text.cgi(拡張子あっていますでしょうか?) def main(): print('''Content-Type: text/html; charset=UTF-8 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> 賢い子は父親を喜ばせ,愚かな子は母親を悲しませる。 </body> </html> ''') この①~③までの3つのファイルを作成し、アップロードするという事であっていますでしょうか?
itagagaki

2021/09/27 10:54

PythonにファイルのエンコードがUTF-8であることを認識させるためエンコードをBOM付きUTF-8にするという策を示しましたが、katsukoさんが提示された策(# coding: utf-8 をスクリプトの2行目に記述する)が有効ならそれで解決だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問