CGI-BBS > CGI > Perl > Perlの改造で半角カナを入力すると文字化けなってしまう。


カレッヂ
カレッヂ


質問者 バカボン  投稿日 2004/6/22(火) 11:05:03
現在、モバイルサイトを設置に当たり、半角カナを入力してもそのまま表示できるようにしたいのですが
半角カナを入力すると文字化けを起こしてしまいます。
結局、サーバー側で半角カナは表示できないという結論に至り、半角カナが入力されてもすべて全角に変換するようにしたいのですが
今、カスタマイズしてるCGIのどの部分を具体的にどのようなソースを加えたらいいのか?
見当がつきません。
下記に現在、編集中のソースを一部を公開しますのでお手数ですがご教授願います。
###################
#   ViewConvert   #
###################
sub ViewConvert{ my($all,$save,$target)=@_; $i=-1;
foreach(@{$save}){ $i++;
    if(${${$all}{Link}}{$_}){ ${$target}[$i]=&UnAutoLink(${$target}[$i]) }
    if(${${$all}{Lines}}{$_}){ ${$target}[$i]=~s/<BR>/\n/g }
    if(${${$all}{Select}}{$_}){ foreach$a(split/,/,${$target}[$i]){ $Select{$_}{${${$all}{Select}}{$_}{$a}}='selected' } }
    if(${${$all}{CheckBox}}{$_}){ foreach$a(split/,/,${$target}[$i]){ $CheckBox{$_}{${${$all}{CheckBox}}{$_}{$a}}='checked' } }
    ${$target}[$i]=~s/"/&quot;/g;
    $DATA{$_}=${$target}[$i];
}}
#######################
#   RegistDataCheck   #
#######################
sub RegistDataCheck{ my($all,$nopass)=@_;
foreach(@{${$all}{Necessary}}){
    next if(($_ eq '') or ($_ eq 'Pass' and $nopass));
    if($FORM{$_} eq ''){ $item=${$all}{DataName}{$_}; &Error("$itemが入力されていません。"); }
}while(($a,$b)=each(%{${$all}{Same}})){
    next if(($a eq '' or $b eq '') or (($a eq 'Pass' or $b eq 'Pass') and $nopass));
    if($FORM{$a} ne $FORM{$b}){ ($a,$b)=(${$all}{DataName}{$a},${$all}{DataName}{$b}); &Error("$aと$bの入力が違います。"); }
}while(($item,$maxlen)=each(%{${$all}{Mojisu}})){
    next if(($item eq '') or ($item eq 'Pass' and $nopass));
    $len=length($FORM{$item});
    if($len > $maxlen){ $item=${$all}{DataName}{$item}; &Error("$itemが最大文字数を越えています。<BR>(最大:$maxlen文字 現在:$len文字)"); }
}while(($item,$pattern)=each(%{${$all}{Valid}})){
    next if($item eq '' or $FORM{$item} eq '' or ($item eq 'Pass' and $nopass));
    if($FORM{$item} !~ /$pattern/i){ $item=${$all}{DataName}{$item}; &Error("$itemの入力が不正です。"); }
}while(($item,$pattern)=each(%{${$all}{Invalid}})){
    next if($item eq '' or $FORM{$item} eq '' or ($item eq 'Pass' and $nopass));
    if($FORM{$item} =~ /$pattern/i){ $item=${$all}{DataName}{$item}; &Error("$itemの入力が不正です。"); }
}while(($item,$maxnum)=each(%{${$all}{NumMax}})){
    next if(($item eq '') or ($item eq 'Pass' and $nopass));
    $FORM{$item} eq '' and next;
    if($FORM{$item} > $maxnum){ $item=${$all}{DataName}{$item}; &Error("$itemの数値が大きすぎます。(最大:$maxnum)"); }
}while(($item,$mininum)=each(%{${$all}{NumMini}})){
    next if(($item eq '') or ($item eq 'Pass' and $nopass));
    $FORM{$item} eq '' and next;
    if($FORM{$item} < $mininum){ $item=${$all}{DataName}{$item}; &Error("$itemの数値が小さすぎます。(最小:$mininum)"); }
} }

#########################
#   RegistDataConvert   #
#########################
sub RegistDataConvert{ my($all)=@_;
foreach(@{${$all}{All}}){
    $FORM{$_}=&TagConvert($FORM{$_},$_,\%{${$all}{Tag}},${${$all}{Link}}{$_});
    $FORM{$_}=~s/<>/&lt;&gt;/g;
    ${${$all}{Lines}}{$_} ? $FORM{$_}=~s/\n/<BR>/g : $FORM{$_}=~s/\n//g;
}}
##################
#   MojiHenkan   #
##################
sub MojiHenkan{ my($line,$type)=@_;
&MojiTable($type);
$line=~s/([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])/exists$MTABLE{$1}?$MTABLE{$1}:$1/ego;
return($line);}
#################
#   MojiTable   #
#################
sub MojiTable{ my$type=shiftjis;
if($type eq 'search'){
%MTABLE=qw(0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 
A a B b C c D d E e F f G g H h I i J j K k L l M m 
N n O o P p Q q R r S s T t U u V v W w X x Y y Z z 
a a b b c c d d e e f f g g h h i i j j k k l l m m 
n n o o p p q q r r s s t t u u v v w w x x y y z z 
A a B b C c D d E e F f G g H h I i J j K k L l M m 
N n O o P p Q q R r S s T t U u V v W w X x Y y Z z 
ァ ァ ィ ィ ゥ ゥ ェ ェ ォ ォ ャ ャ ュ ュ ョ ョ ッ ッ 
ア ア イ イ ウ ウ エ エ オ オ カ カ キ キ ク ク ケ ケ コ コ サ サ シ シ ス ス セ セ ソ ソ 
タ タ チ チ ツ ツ テ テ ト ト ナ ナ ニ ニ ヌ ヌ ネ ネ ノ ノ ハ ハ ヒ ヒ フ フ ヘ ヘ ホ ホ 
マ マ ミ ミ ム ム メ メ モ モ ヤ ヤ ユ ユ ヨ ヨ ラ ラ リ リ ル ル レ レ ロ ロ ワ ワ ヲ ヲ ン ン 
ヴ ヴ ガ ガ ギ ギ グ グ ゲ ゲ ゴ ゴ ザ ザ ジ ジ ズ ズ ゼ ゼ ゾ ゾ ダ ダ ヂ ヂ 
ヅ ヅ デ デ ド ド バ バ パ パ ビ ビ ピ ピ ブ ブ プ プ ベ ベ ペ ペ ボ ボ ポ ポ);
}}
##########################################################

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:perleditor
FTPソフト:ffftp
サーバ移転:していない
改造:している 改造前正常動作
CGI習熟度:pro

回答者 sim  [削除]  投稿日 2004/6/22(火) 14:15:27
1.修正点
#################
#   MojiTable   #
#################
sub MojiTable{ my$type=shift;#ここを修正。

2.使い方
require 'ファイルの名前';
$line = 'アイウエオとかの入力文字列';
$line = MojiHenkan($line,'search');

としてやれば変換されるんじゃないでしょうか?
jcode.plを利用してるなら、そっちにも半角/全角のconvertがあるのでそっちを使ってみても良い気がします。
質問者 バカボン  [削除]  投稿日 2004/6/24(木) 06:50:50
ご返事ありがとうございます
今現在、jcode.plを使っていますが、使っていても文字化けを起こしていますので
今現在のソースに、書いて頂いたソースを加える必要がありますよね?

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


Web裏技