- ベストアンサー
半角カタカナ文字化け回避方法
- WEB上でのキャンペーン応募フォームにおいて、半角カタカナの文字化けを避ける方法を教えてください。
- 半角カナを入力しないように指示しても、ユーザーが半角カナを入力することを避けられません。データの保存にはCSVファイルを使用していますが、正しいデータの取得ができません。
- Perlを使用していて、半角カナが入力されていない場合は変換できるモジュールを見つけましたが、フリガナの文字化けは避けられません。入力時に半角カナを排除する方法や、Perlでの変換方法を知っている方がいらっしゃれば、教えていただきたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
送信された文字コードが何であるかは、半角カナ以外の文字で調べる必要があります。 まず送信フォーム内に <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などに変換して下さい。
その他の回答 (3)
- leaz024
- ベストアンサー率75% (398/526)
> しかし、iMODEにも対応しているため、ファイルが2kまでとなっているのでフォーム内へのしかけができないんです。 仕掛けに使う「あ」の部分は、シフトJISとして jcode が認識してくれさえすれば、別のものでも構いません。 例えば、送信ボタンを仕掛けとして使えば、サイズはちょっとで済むと思いますよ。 例: <INPUT type="submit" name="a" value="送信"> のようにして、デコードする時に $FORM{'a'} の値で getcode する。 この方法なら、最悪ダブルクォートを抜いたとして、HTMLは7バイトの増加で済みます。 また、$ENV{'HTTP_USER_AGENT'} を見て、iモードからの送信ならばsjisと決め打ちして変換する、なんてのも有効ですよ。 (iモードからは、必ずシフトJISで送信されてくるので。)
- hamatyu
- ベストアンサー率62% (18/29)
csvの区切り文字をタブから,(カンマ)に変えてみてはどうでしょうか?? UNIXマシンだとタブを判別できないと思うので
お礼
住所やテキスト入力があるためタブ区切りを使用しています。カンマなどの記号は入力されることがあるので・・・ すみません ありがとうございました。
- oodaiko
- ベストアンサー率67% (126/186)
日本語文字コード変換パッケージとして有名なjcode.pl には半角カナを全角カナに変換する関数があります。 試してみてはいかがでしょうか。下のURLに詳しい解説があります。
お礼
ありがとうございます。 jcode.plは試したのですが、どうしても1文字目の文字化けが避けられないのです。 csvはタブ区切りにしています。
お礼
返信遅くなってすみません。 上記のスクリプトを入れるためには、根本的にプログラムを作り直さなければならないので、テストができませんでした。 多分、この方法で解決できると思います。 しかし、iMODEにも対応しているため、ファイルが2kまでとなっているのでフォーム内へのしかけができないんです。 PCからの入力では半角カタカナはほとんどなかったのですが、iMODEからの入力を回避できなくて結局毎日ファイルを手直ししました。 次回試してみます。 ありがとうございました。