CGIをCGIにする

まずはサーバにCGIスクリプトだと認識させなければなりません。 分かっていてもこれがやっかいで、容赦なく500を返されます。 以下が基本事項です

Pythonの場合は以下にも気をつけるべきです

HelloWorld!

サンプルコードを載せます
インタプリタへのパスはこのページで示した例です

                #!/home/アカウント名/local/python/bin/python3.4
                # coding: utf-8
                print('Content-type: text/html; charset=UTF-8\r\n')
                print("HelloWorld!")
            

コンテンツの内容を知らせるためにContent-typeヘッダは必ず出力しなければいけません。 最後にはヘッダの終わりを告げる改行コード\r\nを付けます。

パーミッションの指定はFFFTPなどを使えば楽でしょう。 文字コード、改行コード、シグネチャの有無の指定は、 VisualStudioであればファイル->保存オプションの詳細設定から、 TeraPadであれば表示->オプション->文字コードから設定できます。 シグネチャの有無の指定は、VSはUTF-8シグネチャなしとなっているもの、 TeraPadはUTF-8Nを選ぶことでシグネチャ無しの設定になります

きちんと動作すればこのような出力になります。


マルチバイト文字列の出力

Pythonで日本語を扱うのはけっこうやっかいです。

前項のコードを書き換えます

                #!/home/アカウント名/local/python/bin/python3.4
                # coding: utf-8
                print('Content-type: text/html; charset=UTF-8\r\n')
                print("はろー")
            

実行しても何も出ないと思います。 日本語を扱うときはもう一捻り必要になります

上記のコードに追記します

                #!/home/アカウント名/local/python/bin/python3.4
                # coding: utf-8
                import sys
                import io
                sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
                print('Content-type: text/html; charset=UTF-8\r\n')
                print("はろー")
            

                sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
            
魔法の文字列です。出力をラップしています(参考URL)

Pythonにデフォルトで設定されている文字コードはUS-ASCIIで、それをUTF-8に変えています。 日本語を出力したいときはだいたいこれを書くと動きます。 動いているものがこちら