OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

半角カタカナの文字化けを避ける方法を教えてください

  • すぐに回答を!
  • 質問No.144863
  • 閲覧数473
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 15% (3/19)

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

質問者が選んだベストアンサー

  • 回答No.3
レベル12

ベストアンサー率 75% (398/526)

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

まず送信フォーム内に
  <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などに変換して下さい。
お礼コメント
mieko

お礼率 15% (3/19)

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

その他の回答 (全3件)

  • 回答No.1
レベル11

ベストアンサー率 67% (126/186)

日本語文字コード変換パッケージとして有名なjcode.pl には半角カナを全角カナに変換する関数があります。 試してみてはいかがでしょうか。下のURLに詳しい解説があります。 ...続きを読む
日本語文字コード変換パッケージとして有名なjcode.pl
には半角カナを全角カナに変換する関数があります。
試してみてはいかがでしょうか。下のURLに詳しい解説があります。
お礼コメント
mieko

お礼率 15% (3/19)

ありがとうございます。
jcode.plは試したのですが、どうしても1文字目の文字化けが避けられないのです。
csvはタブ区切りにしています。
投稿日時 - 2001-10-03 13:24:34


  • 回答No.2
レベル8

ベストアンサー率 62% (18/29)

csvの区切り文字をタブから,(カンマ)に変えてみてはどうでしょうか?? UNIXマシンだとタブを判別できないと思うので ...続きを読む
csvの区切り文字をタブから,(カンマ)に変えてみてはどうでしょうか??
UNIXマシンだとタブを判別できないと思うので
お礼コメント
mieko

お礼率 15% (3/19)

住所やテキスト入力があるためタブ区切りを使用しています。カンマなどの記号は入力されることがあるので・・・
すみません
ありがとうございました。
投稿日時 - 2001-10-16 20:14:44
  • 回答No.4
レベル12

ベストアンサー率 75% (398/526)

> しかし、iMODEにも対応しているため、ファイルが2kまでとなっているのでフォーム内へのしかけができないんです。 仕掛けに使う「あ」の部分は、シフトJISとして jcode が認識してくれさえすれば、別のものでも構いません。 例えば、送信ボタンを仕掛けとして使えば、サイズはちょっとで済むと思いますよ。 例:  <INPUT type="submit" na ...続きを読む
> しかし、iMODEにも対応しているため、ファイルが2kまでとなっているのでフォーム内へのしかけができないんです。

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

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

また、$ENV{'HTTP_USER_AGENT'} を見て、iモードからの送信ならばsjisと決め打ちして変換する、なんてのも有効ですよ。
(iモードからは、必ずシフトJISで送信されてくるので。)
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ