CGI-BBS > 基礎 > その他 > CGIで2バイト文字の判定をしたいのですが


カレッヂ
カレッヂ


質問者 銀杏秋刀魚  投稿日 10/31(水) 16:24:15
みなさん、こんにちは。
このページに支えられて、ちょこっとづつ、進歩しています。
現在、データベースの中のデータを検索するシステムを作成しています。

そこで、ユーザーが入力したデータが全角でない場合は、エラーを
返したいのです。(携帯電話で使うサイトなので、JavaScriptは
使いたくないのです。)
CGIで、2バイト文字と1バイト文字の判別方法があれば
是非教えてください。

よろしくお願いします。お待ちしています。
回答者 あけび  [削除]  投稿日 11/1(木) 12:07:58
sub hz_count {
    local($s) = @_;
    local($l) = length($s);
    $s =~ s/[\x81-\x9f\xe0-\xfc].//g;
    local($zl) = ($l-length($s))/2;
    ($l-$zl*2,$zl);
}

Shift-JISに限りますが、上記サブルーチンで
半角/全角文字数を調べることができます。
調査する文字列を引数として渡すと、
その文字列中に含まれる半角と全角の文字数をリストとして返します。

#使用例
$s = '01234あいう';
($h,$z) = &hz_count($s);
print "文字列:$s 半角文字数=$h 全角文字数=$z";

質問者 銀杏秋刀魚  [削除]  投稿日 11/1(木) 13:11:13
あけびさん、こんにちは。どうもありがとうございました。
教えていただいた関数で、半角入力に対してエラーを返すことが
できました。

半角を全角に変換する関数やモジュール等、ご存知でしたら
又、教えていただけませんか?
よろしくお願いいたします。
回答者 あけび  [削除]  投稿日 11/1(木) 22:05:11
半角 -> 全角変換なら、jcode.pl の h2z や tr が使えると思います。

例:

require './jcode.pl';

# 変換対象文字列
$str = '0123abcd全角';

# eucに変換
&jcode'convert(*str,'euc');
# 半角カタカナ -> 全角変換
&jcode'h2z_euc(*str);

# 半角文字テーブル
$h_table = <<'TABLE';
- !"#$%&'()*+,./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
TABLE

# 全角文字テーブル
$z_table = <<'TABLE';
− !”#$%&’()*+,./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|} ̄
TABLE
# 全角文字テーブル euc変換
&jcode'convert(*z_table,'euc');

# 半角 -> 全角変換
&jcode'tr(*str,$h_table,$z_table);

# Shift-JIS 変換
&jcode'convert(*str,'sjis');

print $str;

質問者 銀杏秋刀魚  [削除]  投稿日 11/2(金) 16:35:13
あけびさん、こんにちは。
ありがとうございます。解決しました。

書いていただいた内容とにらめっこをすること
1時間、やっと意味を理解することができました!!

ほーんとに、勉強になりました。
ありがとうございました。

このページは終了したので返信(回答)は書きこめません

Web裏技