CGI-BBS > CGI > Perl > 全角文字を半角文字に一括変換できませんか?


カレッヂ
カレッヂ


質問者 谷口  投稿日 6/26(火) 21:33:42
全角文字A−Z、0−9、−を半角文字に一括変換できませんか?
また、文字列の中に全角、半角が混在している場合、A−Z、a−z、0−9、−は半角に
それ以外の文字がはいている場合文字列をスペースにする簡単な方法は有りませんか?
回答者 しあわせのツボ  [削除]  投稿日 6/27(水) 00:42:53
jcode.plにあるjcode::trが使えると思います。
ただ、この機能は発展途上であるとのアナウンスがあり、事実いくつかの制限(sjisでは使えない等)がありますので、jcode.plのドキュメントを熟読した上で利用して下さい。
質問者 谷口  [削除]  投稿日 6/27(水) 07:03:33
ありがとうございます。
SJISで同等の処理を行いたいのですが他に手段はないですかね?
回答者 あけび  [削除]  投稿日 6/27(水) 11:45:03
あまり効率は良くないかもしれませんが、こんなのはどうでしょう。

sub lwr {
local(*_) = @_;
s/([\x80-\x9f\xe0-\xff].)/$1\0/g; # 2バイト文字の後ろに\0挿入
s/\x82([\x4f-\x58\x60-\x79])/pack("C",ord($1)-0x1f)/eg; # 0-9,A-Z 半角変換
s/\x82([\x81-\x9a])/pack("C",ord($1)-0x20)/eg; # a-z 半角変換
s/\x81\x7c/-/g; # − 半角変換
s/[\x80-\x9f\xe0-\xff].\0/ /g; # 非該当全角文字をスペース(非該当半角文字)に変換
tr/\0//d; # 残った\0を削除
tr/0-9a-zA-Z\-/ /cs; # 非該当文字列をスペースに変換
$_;
}

使い方は、例えば変数 $str を変換したい場合は
&lwr(\$str);
となります。
回答者 呑兵衛  [削除]  投稿日 6/27(水) 20:34:25
呑兵衛といいます。

事例その2.
# $values を入力文字列とします。
# jcode.pl を呼び出せることが前提です。

# shift_jisコードの全角文字
$zenkaku = 'A-Za-z0-9−ー';

# $zenkaku をeucコードに変換しておく
$code_e = &jcode::euc($zenkaku, 'sjis');

# $zenkaku の対応半角
$hankaku = 'A-Za-z0-9--';

# shift_jisで入力された文字列をeucに変換
$values = &jcode::euc($values, 'sjis');

# 全角だけ半角にeucに置換
$values = &jcode::trans($values, $code_e, $hankaku);

# 対象文字以外をスペースに置換
$values =~ s/[^0-9A-Za-z-]+/ /g;

# 後続のためにshift_jisに変換
$values = &jcode::sjis($values);
質問者 谷口  [削除]  投稿日 6/28(木) 14:49:19
うまく処理できました。
皆さん、ご親切にありがとうございました。

このページは終了したので返信(回答)は書きこめません

Web裏技