全角英数字を半角に変換したいのですけれど……

[上に] [前に] [次に]
麻海桜 [E-Mail] [HomePage] 1998/03/05(木) 00:07:18
はじめまして。
先日ようやくHPらしきものができてきて、ここのCGI使わせて頂きました。
ありがとうございます(^^)

あの、質問なのですが、
掲示板とかで、メールアドレスとURLを全角で入力された時、半角に変換するにはどうすればいいでしょうか?
Jcode.plでそういう機能あるのでしょうか。
結構全角英字で入力されたりしてしまうみたいなので……どうしようかと思って。

B-Cus 1998/03/05(木) 00:32:52
require 'jcode.pl';
&jcode'convert(*mail,'euc');
$mail =~ s/A/A/g;
$mail =~ s/B/B/g;



$mail =~ s/9/9/g;

でしょうね。あと、スクリプト自体をEUCにしておく
必要があります。で、多分

$mail =~ tr/0-9/0-9/;

はうまくいかないでしょう(jperlならできますが)。



でも、僕は甘やかすのは嫌なので

if ( $mail !~ m/^[a-zA-Z0-9\.\-\_\@]+$/ ){
 print "メールアドレスが不正です。";
}

とやります。

だって全角のメールアドレス入力するってことは
今後も他のところで同じことをし続ける、ってこと
だから、どこかでそれを知る機会を与えてやらないと。

miyasiro 1998/03/05(木) 02:13:25
$from = '−.:_/〜@0123456789abcdefghijklmnopqrstuvwxyz';
$to   = '-.:_/~@0123456789abcdefghijklmnopqrstuvwxyz';
&jcode'tr(*mail,$from,$to);

でも変換できるようです。また、文字コードが EUC か JIS なら、$fromと$toは下記でもOKです。

$from = '−.:_/〜@0-9A-Za-z';
$to   = '-.:_/~@0-9A-Za-z';

なお、$fromや$toの中では、\ のエスケープができないので、- 自身は最初か最後に指定しなければならないみたいです。

Shift-JISでうまく行かなかったので、結局ソースを読んでしまった(苦笑)。jcode.pl にも書いてあるけど、本来の tr とは違いがあるので、十分に注意して使う必要がありそうです。
MS-IE は半角のアドレスを辞書登録すると、全角でも自動的に同じ読みで登録して削除できないので、うっかり間違いそうになることがあるんですよね(なんとかならないかなぁ〜)。

B-Cus 1998/03/05(木) 02:23:41
へ〜、jcode'trってものがあったのか〜…と
思ったら、うちのjcode.pl(v1.8)にはtrがない。

archieでv1.9を落としてきたけど、そこにもない。

というわけで、miyasiroさんのjcode.plのバージョンは
何ですか? あとどこから入手されましたでしょうか。

miyasiro 1998/03/05(木) 02:38:43
jcode.pl,v 2.0 1996/10/02
です。たしか、Web裏技(http://www.ask.or.jp/~rescue/)だったと思います。
(URLが古いかも知れません)

それから、MS-IE は、MS-IME の間違いでした。

それから、それから、なんで EUC に限るんだろうと思ったら、第2バイトの \ が問題なのですね。

miyasiro 1998/03/05(木) 02:45:53
[追伸]とほほさんが紹介している
ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/
をいま覗いてきたのですが、
jcode.pl,v 2.6 1997/12/24
が最新のようです。jcode'tr も新しくなってるかも?


B-Cus 1998/03/05(木) 02:57:32
> ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/

どうやらここが一次配布元みたいですね。
どうもありがとうございました。

> それから、それから、なんで EUC に限るんだろうと思ったら、
> 第2バイトの \ が問題なのですね。

えっとEUCうんぬんというのは僕の発言ですか?
これはよくわからなかったので、$mailとスクリプト
自体の文字コードを同じにしときゃいいかな、くらい
の認識でした(^^;

スクリプトがEUCで$mailがSJISやJISのとき、
 $mail =~ s/あいう/かきく/;
はうまくいかないんじゃないかな、と思っておるんですが。


miyasiro 1998/03/05(木) 03:03:49
>でしょうね。あと、スクリプト自体をEUCにしておく
>必要があります。で、多分
の部分のつもりでした。

>これはよくわからなかったので、$mailとスクリプト
>自体の文字コードを同じにしときゃいいかな、くらい
>の認識でした(^^;
なるほど、それはそうですね。

>どうやらここが一次配布元みたいですね。
とほほさんが掲示板とかで紹介されてるんですが、これを見て作者の方だろうから一度行かなければとおもいつつ、さっきまで忘れてました(苦笑)。

miyasiro 1998/03/05(木) 03:19:48
いま、jcode.pl,v 2.6 の jcode'tr の説明を読んでみました。
2.0 よりもちゃんと説明されてました。仕様は変わらないようですが、これを読んでれば、わざわざソースを解読する必要なかった…。
コードは少し書き換わっているようですが、かなめの部分はほとんど変わらないと思います。

miyasiro 1998/03/05(木) 22:51:51
 ちょっと書き残しです。
>スクリプトがEUCで$mailがSJISやJISのとき、
> $mail =~ s/あいう/かきく/;
>はうまくいかないんじゃないかな、と思っておるんですが。
 これは、当然その通りだと思います。
 それと、文字コードを統一するにしても、SJISの場合には、正規表現に日本語を使うのはかなりヤバイみたいです(いままで危ないとは思いつつも曖昧なままにしてたのですが…)。'\'と'@'が第2バイトに来る場合は、ダブルクオートで括った文字列の場合と同じですが、さらに'['と']'と'|'('{'と'}'も?)が第2バイトに来る場合も問題になります。しかも、これらはシングルクオートで括って一旦変数に代入してから正規表現として使ってもメタキャラクタと解釈されるんで、文字コードを直接指定する他ないようです。例えば、
$_ = 'AB−CD';
s/−/-/g; # '−'は SJIS では 81h と 7Ch(|)
とすると、$_ は、'-*`-*a--|-*b-*c-' ( * は本当は80h以上のコード )となってしまいます。
やっぱり、EUC が一番扱いやすいようですね。

麻海桜 [E-Mail] [HomePage] 1998/03/07(土) 22:43:21
[[解決]]
いろいろ有難うございました。


> だって全角のメールアドレス入力するってことは
> 今後も他のところで同じことをし続ける、ってこと
> だから、どこかでそれを知る機会を与えてやらないと。

ってその通りですね。

perl初心者なのですが、いろいろ教えて頂いてとても勉強になりました。
もっと勉強してCGI組めるよう頑張ります(^^;)

本当に有難うございました。


[上に] [前に] [次に]