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

お世話になります。
今、フォームから入力された半角カナを全角カナへ変換しようとしているのですが、どうしてもうまく行きません。
処理は以下のようにしています。

jcode::convert(\$str, 'euc');
if($str =~ /[\xA1-\xDF]/){
jcode::h2z_euc(\$str);
}

(1)まず、半角カナが含まれているかのチェックで[\xA1-\xDF]を使用していますが色々調べたところ、実際は
(?:\x8E[\xA6-\xDF])
が正しいようなのですが、この場合文字数が少ないとひっかかってくれません。例えば半角のア1文字や2文字など。また、文字数が多くても半角英数と半角カナが混在しているとひっかからない場合もあります。
上記の式だとひっかかってくれますが、この判定で構わないのでしょうか。

(2)上記の式できちんと置換されるものとされないで漢字のように文字化けするものと出てきてしまいます。
例えば「インターフェース」などという半角は全滅です。
「バージョン」などは大丈夫でした。

間違いなど教えて頂ければと思います。
宜しくお願い致します。

A 回答 (1件)

まず1行目の jcode::convert(\$str, 'euc'); で文字コードをEUC-JPに変換していることは理解されていますか。


この方法での文字コード変換は$strの内容が短い場合、自動的に文字コードを判別できず変換が失敗することがあります。
これは文字コードの性質上どうしようもありません。
入力される文字コードが確定している場合は3引数目に入力文字コードを入れれば解決できます。

jcode::convert(\$str, 'euc', 'sjis'); # 入力文字コードがsjisの場合

半角カタカナが[\xA1-\xDF]の範囲なのはsjisです。
EUC-JPは(?:\x8E[\xA6-\xDF])が正しい範囲です。
文字数が少ないと引っかからないのは前述の通りjcode::convertに失敗しているからです。
    • good
    • 0
この回答へのお礼

bgbgさんありがとうございます。
文字コードについてもごちゃごちゃになっていた上、文字によってはきちんと文字コードの取得、変換が出来ないという事を分かっていませんでした。
今回、sjisである事は分かっていますので、教えて頂いた通りに文字コードの指定をする事で綺麗に置換する事が出来ました。

随分長いこと悩んでいたので本当にありがとうございます。

お礼日時:2006/12/19 16:26

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