• ベストアンサー

うまくいかない全角→半角変換の仕方

あちこち見てまわったのです。 とほほの ~ から個人の小規模なページまで。 $add ='test@test.ne.jp'; jcode::convert(\$add, 'euc'); jcode::tr(\$add, '0-9A-Za-z', '0-9A-Za-z'); jcode::convert(\$add, 'sjis'); print $add; ・・・@マークがまあ、この場合変換対象にはいって ないにしろ、なぜか表示されるものは、数字の 「11」 とか 文字列を変えると場合によっては「8」 とか出てきます。 また(2度目)借りているサーバー環境が悪いんで しょうか??? ほとほと参ってます(泣)。

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

  • ベストアンサー
  • tfp
  • ベストアンサー率37% (3/8)
回答No.4

スクリプトは Shift_JIS で書いてあるんですよね? だとしたら、この場合 trの第2引数 '0-9A-Za-z' もeucにしないとだめでしょう。 $add ='test@test.ne.jp'; jcode::convert(\$add, 'euc'); $euc_zen = '0-9A-Za-z'; jcode::convert(\$euc_zen, 'euc'); jcode::tr(\$add, $euc_zen, '0-9A-Za-z'); jcode::convert(\$add, 'sjis'); print $add;

yasu
質問者

お礼

やはりSJISでやるのはあきらめた方がいいのか・・・ そう思いかけた矢先、ftp さんのご指摘で、ハッと 気が付きました。おっしゃる通りです。 本日帰ったら試してみます。 回答に心より感謝いたします。

yasu
質問者

補足

お名前間違えていました。大変失礼いたしました!!!

その他の回答 (3)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.3

# 正規表現では変換不可な連番でないパターンテーブル # ただしここでは半角文字が書けないので # 正確には'半角' => '全角' になっています。 %utf8tbl = ( '¥' => '\\', '。' => '。', '「' => '「', '」' => '」', '、' => '、', '・' => '・', 'ッ' => 'ッ', 'ー' => 'ー', 'タ' => 'タ', 'チ' => 'チ', 'ワ' => 'ワ', 'ヲ' => 'ヲ', 'ン' => 'ン', '゛' => '゛', '゜' => '゜', 'ヴ' => 'ヴ', 'ダ' => 'ダ', 'ヂ' => 'ヂ', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド' ); # いかんUTF-8文字を変換 sub utf8chconv($){ $_ = $_[0]; if(/\xef\xbd([\x80-\x9e])/){ # `a..z{|}~ $ret = chr(ord($1) - 32); }elsif(/\xef\xbc([\x81-\xbf])/){ # !../0..9:..@A..Z $ret = chr(ord($1) - 96); }elsif(/^\xef\xbd([\xa7-\xab])$/){ # ァィゥェォ $ret = "\xe3\x82" . chr(ord($1) * 2 - 173); }elsif(/^\xef\xbd([\xac-\xae])$/){ # ャュョ $ret = "\xe3\x83" . chr(ord($1) * 2 - 181); }elsif(/^\xef\xbd([\xb1-\xb5])$/){ # アイウエオ $ret = "\xe3\x82" . chr(ord($1) * 2 - 192); }elsif(/^\xef\xbd([\xb6-\xbf])$/){ # カキクケコサシスセソ $ret = "\xe3\x82" . chr(ord($1) * 2 - 193); }elsif(/^\xef\xbe([\x82-\x84])$/){ # ツテト $ret = "\xe3\x83" . chr(ord($1) * 2 - 128); }elsif(/^\xef\xbe([\x85-\x89])$/){ # ナニヌネノ $ret = "\xe3\x83" . chr(ord($1) + 5); }elsif(/^\xef\xbe([\x8a-\x8e])$/){ # ハヒフヘホ $ret = "\xe3\x83" . chr(ord($1) * 3 - 271); }elsif(/^\xef\xbe([\x8f-\x93])$/){ # マミムメモ $ret = "\xe3\x83" . chr(ord($1) + 15); }elsif(/^\xef\xbe([\x94-\x96])$/){ # ヤユヨ $ret = "\xe3\x83" . chr(ord($1) * 2 - 132); }elsif(/^\xef\xbe([\x97-\x9b])$/){ # ラリルレロ $ret = "\xe3\x83" . chr(ord($1) + 15); }elsif(/^\xef\xbd([\xb6-\xbf])\xef\xbe\x9e$/){ # ガギグゲゴザジズゼゾ $ret = "\xe3\x82" . chr(ord($1) * 2 - 192); }elsif(/^\xef\xbe([\x8a-\x8e])\xef\xbe\x9e$/){ # バビブベボ $ret = "\xe3\x83" . chr(ord($1) * 3 - 270); }elsif(/^\xef\xbe([\x8a-\x8e])\xef\xbe\x9f$/){ # パポプペポ $ret = "\xe3\x83" . chr(ord($1) * 3 - 269); }elsif(exists($utf8tbl{$_})){ # その他正規表現不可 $ret = $utf8tbl{$_}; }else{ $ret = $_; } return $ret; } sub utf8conv($){ $_[0] =~ s/$utf8ex/utf8chconv($&)/eg; return $_[0]; } # 使い方 $x = utf8conv($x); 自分で作った全角英数禁止、半角カナ禁止スクリプトです。 ただし、UTF-8です(お呼びでない?)。 UTF-8、改行コードLFでソースを記述してください。

yasu
質問者

お礼

やはりSJISでやるのはあきらめた方がいいのか・・・ そう思いかけた矢先、#4のftp さんの指摘で、ハッと 気が付きました。( まだ試してないのですが ) この教えていただいた変換方法はperl初心者である私の ライブラリとし、この先ゆくゆく利用させていただき ます。詳細な回答に心より感謝いたします。

回答No.2

文字コード「及び」スクリプト自身がEUCでないとダメっぽいっす。 EUCにしちゃいましょうヽ(´ー`)ノ 嘘です。 基本的にはEUCで書くほうがいいんでしょうが、、、。 ヒアドキュメントを使った方法で回避できるみたいです。 URL載せておきますので試してみてください。

参考URL:
http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-10
yasu
質問者

お礼

昨晩試してみました・・・うーん、おかしい変換でき ない。SJISでやるのはあきらめた方がいいのか・・・ そう思いかけた矢先、#4のftp さんの指摘で、ハッと。 ともあれありがとうございました。 回答に感謝いたします。

  • ceita
  • ベストアンサー率24% (304/1218)
回答No.1

ちょっと数字になってしまう根本的な理由は、 わからないのですが、 参考URLに記号の全角から半角への変換が、 載っています。 組み合わせれば何とか成るのではないでしょうか?

参考URL:
http://www.itboost.co.jp/perl/perl_09.php
yasu
質問者

お礼

ありがとうございます。 実はご紹介いただいたページも参考にさせていただいたの ですが・・・まずEUC に変換、それから大文字→小文字へ と、あのとおり順番にやっているつもりなのですが、 大文字が、大文字のまま返ってくるのです。(つまり何も 変化なし) 他の cgi でjperlを使っているので使用できないはずは ないのですが・・・不思議です。 というかやるせんません。 こうなったら、力技で s/././g; s///\//g; s/0/0/g; s/1/1/g; s/2/2/g; s/3/3/g; s/4/4/g; s/5/5/g; s/6/6/g; s/7/7/g; ・ ・ ・ とかやるしかないのかも。 お手数かけてしまいすみません、似たような経験が ある方がいないか、もう少し回答を待ってみます。

関連するQ&A

専門家に質問してみよう