- 締切済み
s///eg変換で
# ↓OKWEBでは半角カナ表示できないけど、半角カナのつもり @kptk = ( 'ヴ', 'ー', 'ッ', 'ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ア', 'イ', 'ウ', 'エ', 'オ', ・・・ ); # ↓こちらは全部全角カナ @kptv = ( 'ヴ', 'ー', 'ッ', 'ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ア', 'イ', 'ウ', 'エ', 'オ', ・・・ ); for(my $n = 0; $n < @kptk; $n++){ $data =~ s/$kptk[$n]/$kptv[$n]/eg; } などとして、半角カナを全角に直したいのですが、どうも半角の小さい'ァ'だけがまともに変換されません。 その付近の文字やそれ以降すべての文字が文字化けします。 インターネットエクスプローラ5から呼び出しています。 サーバーはソラリス。 文字コードはEUCです。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ide1
- ベストアンサー率77% (7/9)
私の環境で試したのですが、現象が発生しませんでした。 確認環境はソラリス、IE5SP2。 提示されたロジックで、半角小文字のアは全角小文字のア に変換されました。 また、それをブラウザで表示させたところ、文字化けは 起こりませんでした。 -> ソースにテキストエディタで見えないようなコード が混入していませんか?
- natural
- ベストアンサー率37% (419/1115)
不具合の原因は解りかねますが、単純に半角から全角にしたいだけならばh2z_xxx(xxxは変換したい文字コード:jis、sjis、euc)という関数をコールすれば簡単に変換出来ますよ。 例えば、 &jcode'h2z_sjis(\$v); の様にすると、変数vに格納されている文字列中の半角カナを全て全角カナに変換することが出来ます。 お試し下さい。 注)jcode.plが使用可能になっている必要があります。 #ちなみにh2zとは「半角to全角」の略称と思われます。 #逆の機能を持つものとして、z2h_xxxもあります。
お礼
どうやら、2バイト文字の2バイト目と1バイト目とマッチしてしまう関係で、小さいァだけが変な変換をされていたようです。 なんとか解決しました。 ありがとうございました。
補足
配布したいので、できればjcode.plが使えるかどうかの環境を選びたくないのです。 小さい半角のァには、EUCでも困るようなエスケープシークエンスが入っているんでしょうか。
お礼
どうやら、2バイト文字の2バイト目と1バイト目とマッチしてしまう関係で、小さいァだけが変な変換をされていたようです。 なんとか解決しました。 ありがとうございました。
補足
返事が遅くなってすみません。 対象となっているのは大きな半角アではなく、"ファイル" とかの小さな半角ァです。 ちなみに、この方法では2バイト文字の2バイト目と次の2バイト文字の1文字目にマッチすることがあって、文字化けすること頻出でした。 @kptk = (前回のとおり); @kptv = (前回のとおり); $eucpattern = sprintf('([%c-%c][%c-%c])', 0x8E, 0xFE, 0xA1, 0xFE); $eucpattern2 = sprintf('([%c-%c][%c-%c][%c-%c][%c-%c])', 0x8E, 0xFE, 0xA1, 0xFE, 0x8E, 0xFE, 0xA1, 0xFE); for(my $n = 0; $n < @kptk; $n++){ (length($kptk[$n]) == 4) ? ($data =~ s/$eucpattern2/$1 eq $kptk[$n] ? $kptv[$n] : $1/eg) : ($data =~ s/$eucpattern/$1 eq $kptk[$n] ? $kptv[$n] : $1/eg); } などとやって、必ずEUC文字とマッチさせるようにして、変換すべきなら変換するようにしてます。 でもなんか動作が変です。 個のアルゴリズムは間違っているのでしょうか。