漢字のような全角文字は2バイト文字とも呼ばれ、半角文字二文字分のデータを使用します。漢字の表し方は、JIS、SJIS、EUC、Unicodeの4通りあり、統一されていません。
そのため、ブラウザから入力される文字の漢字コードは不定なのですが、CGIの中で扱う漢字コードは統一しておく必要があります。漢字コードの変換には、jcode.plライブラリまたはJcode.pmモジュールが広く使用されています。jcode.plライブラリはUnicodeに対応していません。Jcode.pmモジュールは、サーバー側で設定が必要なので、使えるかどうかはサーバーの管理者に問い合わせてください。K棟ではJcode.pmモジュールは利用できません。ここではjcode.plライブラリを使った漢字コード変換について説明します。
SJISの場合には、2バイトのどちらかがメタ文字(1バイトの特殊文字)と重なっている場合があり、printした場合などに正しく表示されないことがあります。EUCの場合にはこのようなことは起こらないので、EUCに統一しておくことが勧められています。K棟ではSJISで構いません。
jcode.plライブラリの使用宣言
require "jcode.pl";日本語の変換(jcodeライブラリのconvert関数)
&jcode'convert(\スカラー変数, 漢字コード);引数がリファレンス(「\」付き)になっていることに注意。
(例)
&jcode'convert(\$val, "sjis"); # 変数$valをSJISに変換(sjisは小文字に注意)参考プログラム(アップロードしなくても可)
AsPerlで以下のプログラムを入力し、「コマンド」メニューから「出力をwwwブラウザに」を選んで実行して見ましょう。実行したらブラウザの「表示」メニューから「エンコード」を選択して異なる文字コードで表示してみましょう。
#!/usr/local/bin/perl $hello = "こんにちは。"; require "jcode.pl"; # jcodeライブラリ使用 &jcode'convert(\$hello, "sjis"); &header; # HTMLヘッダー print $hello; &footer; # HTMLフッター (略:HTMLのサブルーチン定義)実行例
前回のprint.cgiプログラムに以下の太字の4行を追加して、前回のform.htmに文字を入力してみましょう。
(プログラム print.cgi )
#!/usr/local/bin/perl require "./cgi-lib.pl"; # cgi-lib.plライブラリ使用宣言 require "./jcode.pl"; # jcode.plライブラリ使用宣言 &ReadParse(%in); foreach (%in) { # 連想配列のキーと値の数だけ繰り返し &jcode'convert(\$_, "sjis"); # 連想配列の各要素をsjisに変換 } &header; # HTMLヘッダー foreach (%in) { # 連想配列%inの内容を表示 print $_,"<br>\n"; } &footer; # HTMLフッター (略:HTMLのサブルーチン定義)(実行結果)
message ひとことどうぞ pass number KK-おおおおお name あああああ