日本語に対応

form から入力された姓と名をファイル("log.txt")に保存します。

プログラムの説明

  1. FORM から呼び出す では全角文字を入力するとコードが化けてしまいましたが、今回は日本語に対応します。
    日本語が文字化けする理由は、ネットワークを制御するコードと同じコードは送信出来ないので、全角文字は Encode して送信されるためです。
    詳細は Decode を参照して下さい。
  2. form から姓と名をタイプして "logjpn.cgi" を呼び出します。
    <form action="logjpn.cgi" method="get">
      <input type=text name="str1" value="姓">
      <input type=text name="str2" value="名">
      <input type=submit value="記入したら押してください">
    </form>
    
  3. 日本語の姓名をファイル("log.txt")に追加する logjpn.cgi です。
    #!/usr/local/bin/perl
    use Encode;
    
    print "Content-type: text/html\n\n";
    $file = "log.txt";
    $buffer = $ENV{QUERY_STRING};
    $buffer =~ tr/+/ /;
    $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ge;
    $str = Encode::decode('utf-8', $buffer);
    $str = Encode::encode('shift_jis', $str);
    @s = split('&',$str);
    foreach $i(0 .. $#s)
    {
        ($key, $val) = split('=',@s[$i]);
        $para {$key} = $val;
    }
    open (LOG, ">>$file");
    print LOG "$para{'str1'} $para{'str2'}\n";
    close (LOG);
    print "log.txt に保存しました\n";
    
  4. form はユーザーがデータを入力する基本となるタグです。
    タグは大文字でも小文字でも構わないのですが、最近は小文字が増えてきているようです。
    form にはサーバーで実行するプログラムと、プログラムに渡すデータを定義します。
    action オプションには、フォームに入力されたデータを処理する CGI などのプログラムを指定します。
    今回は form の action から logjpn.cgi を呼び出しています。
    method オプションは、ポストバックのときにデータを渡す方法で get と post があります。
        <form action="logjpn.cgi" method="get">
    
  5. データは input type=text からタイプ入力します。
    name オプションは、入力フィールドに記入されたデータを、他のフィールドと区別するためのIDを指定します。
        <input type=text name="str1" value="姓">
        <input type=text name="str2" value="名">
    
  6. form に入力されたデータは、環境変数 'QUERY_STRING' に格納して CGI に渡されます。
    CGI では 'QUERY_STRING' からデータを取得してデコードします。
    URL Decode すると文字コードは utf-8 になります。
    log.txt は shift_jis で書かれているので utf-8 を shift_jis に変換します。
    詳細は Decode を参照して下さい。
        $buffer = $ENV{QUERY_STRING};
        $buffer =~ tr/+/ /;
        $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ge;
        $str = Encode::decode('utf-8', $buffer);
        $str = Encode::encode('shift_jis', $str);
    
  7. パラメータを解析して連想配列に格納します。
    詳細は パラメータ を参照して下さい。
    @s = split('&',$buffer);
    foreach $i(0 .. $#s)
    {
        ($key, $val) = split('=',@s[$i]);
        $para {$key} = $val;
    }
    
  8. log.txt を追加書き込みモードでオープンして、姓と名を追加します。
    open (LOG, ">>$file");
    print LOG "$para{'str1'} $para{'str2'}<br>";
    
    log.txt の確認は サーバーのファイルを入力 を参照して下さい。

前田稔の超初心者のプログラム入門
超初心者のプログラム入門(Perl)