漢字コードの話

漢字のような全角文字は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
あああああ