プロが教える店舗&オフィスのセキュリティ対策術

WEB上でキャンペーン応募フォームを作ったのですが、半角カナを入れないでくださいとのコメントを入れても、半角カナを打つ人がいるのは避けられません。
CSVファイルにてデータを保存しなければならないのですが、正しいデータが取れません。
登録件数が多いので(数万件になります)手直しも困難な状態です。
言語はPerlを使っています。
1文字目に半角カナがなければ、変換できるモジュールは見つけたのですが、それだとフリガナの文字化けが避けられないのです。
入力時に半角カナをはじく方法、もしくはperlにて変換する方法をご存じの方がいらっしゃいましたら、教えていただけますでしょうか。
よろしくおねがいします。

A 回答 (4件)

日本語文字コード変換パッケージとして有名なjcode.pl


には半角カナを全角カナに変換する関数があります。
試してみてはいかがでしょうか。下のURLに詳しい解説があります。

参考URL:http://www.mikeneko.ne.jp/~lab/kcode/jcode.html
    • good
    • 0
この回答へのお礼

ありがとうございます。
jcode.plは試したのですが、どうしても1文字目の文字化けが避けられないのです。
csvはタブ区切りにしています。

お礼日時:2001/10/03 13:24

csvの区切り文字をタブから,(カンマ)に変えてみてはどうでしょうか??


UNIXマシンだとタブを判別できないと思うので
    • good
    • 0
この回答へのお礼

住所やテキスト入力があるためタブ区切りを使用しています。カンマなどの記号は入力されることがあるので・・・
すみません
ありがとうございました。

お礼日時:2001/10/16 20:14

送信された文字コードが何であるかは、半角カナ以外の文字で調べる必要があります。



まず送信フォーム内に
  <INPUT type="hidden" name="dummy" value="あ">
のようにして、全角文字を送信するよう仕込んでおきます。

受け取り側CGIでは、全パラメータを分解・格納した後、キーdummyに入っていた文字をjcode::getcodeに掛け、「あ」の文字コードを得ます。
これをjcode::convertの第3引数にして変換すれば、半角カナも正しく取得できるはずです。
(つまり元コードを指定することで、別のコードとして変換されるのを防ぐわけです。)

Sample
------
# よくあるパラメータ分解・格納部分
if ($ENV{'REQUEST_METHOD'} =~ /POST/i) {
  read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
} else {
  $buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/,$buffer);
foreach (@pairs) {
  my ($key,$val) = split(/=/,$_);
  $val =~ tr/+/ /;
  $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
  $FORM{$key} = $val;
}
# 「あ」の文字コードを調べ、全パラメータを変換
$icode = &jcode::getcode(\$FORM{dummy});
foreach (keys %FORM) {
  &jcode::convert(\$FORM{$_}, 'sjis', $icode);
}

※見易さのため全角SPを入れていますので、コピペする場合は半角SPなどに変換して下さい。
    • good
    • 0
この回答へのお礼

返信遅くなってすみません。
上記のスクリプトを入れるためには、根本的にプログラムを作り直さなければならないので、テストができませんでした。
多分、この方法で解決できると思います。
しかし、iMODEにも対応しているため、ファイルが2kまでとなっているのでフォーム内へのしかけができないんです。
PCからの入力では半角カタカナはほとんどなかったのですが、iMODEからの入力を回避できなくて結局毎日ファイルを手直ししました。
次回試してみます。
ありがとうございました。

お礼日時:2001/10/16 20:19

> しかし、iMODEにも対応しているため、ファイルが2kまでとなっているのでフォーム内へのしかけができないんです。



仕掛けに使う「あ」の部分は、シフトJISとして jcode が認識してくれさえすれば、別のものでも構いません。
例えば、送信ボタンを仕掛けとして使えば、サイズはちょっとで済むと思いますよ。
例:
 <INPUT type="submit" name="a" value="送信">
 のようにして、デコードする時に $FORM{'a'} の値で getcode する。

この方法なら、最悪ダブルクォートを抜いたとして、HTMLは7バイトの増加で済みます。

また、$ENV{'HTTP_USER_AGENT'} を見て、iモードからの送信ならばsjisと決め打ちして変換する、なんてのも有効ですよ。
(iモードからは、必ずシフトJISで送信されてくるので。)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!