WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:全角英字大文字・小文字を半角に

0:[投稿] kimijang [MAIL] [2002/05/10 05:01 ][環境:WIN+IE UNIX系+Perl]

度々お世話になります。
お知恵をお借りしたいです。

$val =~ s/A/A/g;
という好ましくない気がしますが、全角から半角へ変換しています。
これをa‐zですると、他の文字が化けてしまうことがあるので、化ける文字をエスケープすることになるのですが、エスケープせずに上手く全角→半角変換できる方法は無いものでしょうか?
(S-JISを使用しています。EUCは使いません。)


1:[回答] ふじ [URL] [2002/05/10 06:29 ]

> EUCは使いません。
という前提があるのなら役に立たない情報ですが、一応。
http://www.din.or.jp/~ohzaki/perl.htm#JP_Z2H

# Perlで日本語文字列を扱うときは、一旦 EUC に変換して
# 処理するのが楽だと思いますが。


2:[回答] a [2002/05/10 11:30 ]

http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-10


3:[回答] kimijang [2002/05/10 12:33 ]

ご回答ありがとう御座います。

ふじ様
Pearメモは拝見していました。で、愚問かもですが、
>一旦 EUC に変換して
の場合、表示する際にS-JISに戻すことも必要になるのですが、このコンバートに掛かる処理時間はどのくらい掛かるものでしょうか?

#例えば(パターンマッチでバイトズレの処理をしない)検索時にS-JIS
#で行うのと、一度変換する場合とでは速度がS-JISにくらべ極度に遅い#のかなと思っていまして。

a様
ありがとうございます。ヒアドキュメントで可能なんですね。
全く予想もしていませんでした。


4:[回答] kimijang [2002/05/10 12:50 ]

a様
誤変換してしまいますが?


5:[回答] kimijang [2002/05/10 12:55 ]

すいません、途中で投稿してしまいました。

えと、
&jcode::tr(\$line, '0-9A-Za-z', '0-9A-Za-z');
と何も変わりません。
これではAが3に置き換わってしまって更なる悪化を招いてしまいます。


6:[完了] kimijang [2002/05/12 19:22 ]

ふじさま
>一旦 EUC に変換して
EUCに一度変換してみたのですが、検索時S-JISで
2秒(CPU)ほど遅くなり、しょんぼりでした。


7:[完了] ふじ [URL] [2002/05/13 15:54 ]

> EUCに一度変換してみたのですが、検索時S-JISで
> 2秒(CPU)ほど遅くなり、しょんぼりでした。

もしかして内部でデータをSJISで持っていて、それを検索時に全てEUCに変換してから
検索、というようなことをしているのでしょうか。
# 検索対象のデータの大きさにもよりますが、それでは当然遅くなりますね。

「全角→半角変換」する対象はフォームからの入力文字列ですよね?
(検索対象のデータではなくて)
であれば、
・フォームからのデータを EUC に変換。
・Jcode.pm(or jcode.pl) で全角→半角変換。
・EUC→SJIS 変換。
としてから検索すればよいのでは。

または、内部では EUC でデータを保持して、全て EUC で処理。
HTML出力時に SJIS に変換。としてもいいかも。
# 私は普通、こうしています。


8:[質問] kimijang [2002/05/13 20:15 ]

>もしかして内部でデータをSJISで持っていて、それを検索時に全てEUCに変換してから
>検索、というようなことをしているのでしょうか。

はい、仰られるとおりでした。

>・フォームからのデータを EUC に変換。
>・Jcode.pm(or jcode.pl) で全角→半角変換。
>・EUC→SJIS 変換

 えと、下記のようにしているのですが、具体的にどのようにすればよいでしょうか?
いろいろ試してみたのですが、うまく。いきませんでした。
お手数お掛けしますが教えてください。

    @query = split(/&/,$query);
    foreach $pair (@query) {

        ($key,$val) = split(/=/,$pair);
        $key =~ tr/+/ /;
        $val =~ tr/+/ /;

    foreach $i (0x00 .. 0xFF) {
    $unescape{sprintf('%02x', $i)} = chr($i);
    $unescape{sprintf('%02X', $i)} = chr($i);
        }
    $key =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/$unescape{$1}/g;
    $val =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/$unescape{$1}/g;
        $val =~ s/A/A/g;    $val =~ s/B/B/g;    $val =~ s/C/C/g;
〜中略〜
        $val =~ s/9/9/g;

        &jcode'h2z_sjis(*val);
        &jcode'convert(*val,'sjis');

        $val =~ s/\r\n/\r/g;
        $val =~ s/\n/\r/g;
        $val =~ s/&/&/g;
        $in{$key} = $val; # %in
 }


9:[回答] andi [2002/05/13 20:37 ]

大して検証はしていませんが、以下のような感じでShift_JISでも変換できました。

require 'jcode.pl';

$value = 'あいうAB08cあああ';
&jcode::tr(\$value,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','a-zA-Z');
print $value;


10:[保留] kimijang [2002/05/13 22:11 ]

andiさま

回答ありがとうございます。
なんとtr使って出来たのですね。
過去に一度、A-Za-z で見事に文字化けを起こして以来、試していませんでした。
x82の漢字を交えて変換を試してみます。
ありがとう御座いました。

S-JIS→EUC→S-JISの手法も気になります…。


11:[回答] kimijang [2002/05/13 23:25 ]

漢字を並べて入力してみたところ、化けることもなく大丈夫でした。
ありがとう御座いました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World