電子書籍の厳選無料作品が豊富!

現在、jcode.plを使用したShift JISで構成されていた Perlのcgi を UTF-8 に改造しています。

フォームに書き込んだPAGETITLEを別ファイルへUTF-8で書きこむ際に、文字化けしてしまいます。

書きこんだファイルを開けてみると、日本語が文字化けしています(アルファベットは大丈夫)

以下のPerlのPAGETITLEをどのように改造すれば、文字化けしないで、$foundations_fileへUTF-8で書き込みすることができるのでしょうか?

※個人的にはデータ書き込みの sub REGIST 以下を改造すれば良いのではと推測していますが、どうやれば良いのか分かりません。

どうかご教示、よろしくお願い致します。
m(_ _)m

-------------------------------------


#!/usr/bin/perl
use utf8;
binmode STDIN,":utf8";
binmode STDOUT,":utf8";

#基本セットアップファイル読込
require './setup_manage.cgi';

#このファイル
$cgi = "./foundations.cgi";

#デコード処理
&DECODE;


sub VIEW {

#基本設定ファイルの読み込み
&FOUNDATIONS_READ;

【省略】

<TABLE width="100%" border="0" cellspacing="0" cellpadding="1"><TR>
<TD width="70%">変更するデータを直接書き換えて [ 編集実行 ] を押して下さい。</TD>
<FORM method="post" action="./login.cgi">
<TD width="30%" align="right"><INPUT type="submit" value="メインメニューに戻る"></TD>
<INPUT type="hidden" name="mode" value="main">
<INPUT type="hidden" name="pw" value="$in{'pw'}">
</FORM>
</TR></TABLE>

【省略】

<TABLE border="0" cellspacing="1" cellpadding="4" bgcolor="#999999"><TR>

<FORM name="SUBMIT" method="post" action="$cgi" onSubmit="return kakunin()">

<TD width="160" bgcolor="#eeeeee">
<TABLE border="0" cellspacing="0" cellpadding="1"><TR>
<TD>ページタイトル</TD>
</TR></TABLE>
</TD>
<TD width="400" bgcolor="#ffffff">
<TABLE border="0" cellspacing="0" cellpadding="1"><TR>
<TD><INPUT type="text" name="PAGETITLE" size="60" value="$PAGETITLE"></TD>
</TR></TABLE>
</TD>

【省略】

-------------------------------------------------
# データ書き込み
#-------------------------------------------------
sub REGIST {

#全角英数字を半角に変換
$zenkaku = '0123456789';
$hankaku = '0123456789';

$in{'PAGETITLE'} =~ s/\,/&%/g;
$in{'PAGE1'} =~ s/\,//g;
$in{'PAGE2'} =~ s/\,//g;
$in{'PAGE3'} =~ s/\,//g;
$in{'CATECOL'} =~ s/\,//g;
$in{'PERIOD'} =~ s/\,//g;
$in{'TABLECOL'} =~ s/\,//g;
$in{'SIZECOL'} =~ s/\,//g;
$in{'SIZEROW'} =~ s/\,//g;
$in{'COPYRIGHT'} =~ s/\,/&%/g;


#ファイルロック開始
if( $lockkey ne '0' ){ &LOCK; }

#ファイルに書きこむ
if (!open(OUT,">:utf8",$foundations_file)) { &ERROR( read_foundations ); }

print OUT "$datenow,$in{'PAGETITLE'},$in{'INIMODE'},$in{'MODECHG'},$in{'PAGE1'},$in{'PAGE2'},$in{'PAGE3'},$in{'CATEVIEW'},$in{'CATECOL'},$in{'INICATE'},$in{'PERIOD'},$in{'RANKING'},$in{'CMODE'},$in{'RANKVIEW'},$in{'TITLEVIEW'},$in{'SRCHVIEW'},$in{'INPVIEW'},$in{'DATAROW'},$in{'TABLECOL'},$in{'BARCLR'},$in{'BARPER'},$in{'IMGPRT'},$in{'IMGSIZE'},$in{'SIZECOL'},$in{'SIZEROW'},$in{'IMGFRM'},$in{'COPYRIGHT'},$in{'GPVIEW'},";
close(OUT);


#ファイルロック解除
if( $lockkey ne '0' ){ &UNLOCK; }

&COMP;
}

A 回答 (12件中11~12件)

コードを1つ1つ追跡すれば問題箇所が分かるかもしれませんが、もし%inに入っている値が全てフォームから来る文字列ならば、以前と同じようCGI.pmに丸投げしてみてはどうでしょうか?



# これはコメントアウト
#binmode STDIN,":utf8";

# %inに代入してるところを以下に変更
use Encode;
use CGI;
%in = map decode_utf8($_), CGI->new->Vars;
    • good
    • 0
この回答へのお礼

ryu_chanさま

またご回答頂きまして、ありがとうございました!

#binmode STDIN,":utf8"; として、

#$in{'PAGETITLE'} =~ s/\,/&%/g;
#$in{'PAGE1'} =~ s/\,//g;
#$in{'PAGE2'} =~ s/\,//g;
#$in{'PAGE3'} =~ s/\,//g;
#$in{'CATECOL'} =~ s/\,//g;
#$in{'PERIOD'} =~ s/\,//g;
#$in{'TABLECOL'} =~ s/\,//g;
#$in{'SIZECOL'} =~ s/\,//g;
#$in{'SIZEROW'} =~ s/\,//g;
#$in{'COPYRIGHT'} =~ s/\,/&%/g;

# %inに代入してるところを以下に変更
use Encode;
use CGI;
$in = map decode_utf8($_), CGI->new->Vars;

と変更してみましたが、やはり症状は変わりませんでした。

上記変更方法が間違えているのでしょうか・・・・

お礼日時:2011/05/08 00:04

データをどう取り込んでるか知らんけど, 最悪


何を入力したらどう「化けた」出力が得られるか
を調べて, あとは文字コードから「化け具合」を見付ければなんとかなるかもしれん.

でも, 「REGIST」って何を意味するんだろう. resist のタイポじゃないよなぁ....
    • good
    • 0
この回答へのお礼

Tacosan様、ご回答ありがとうございました。

日本語を入力すると、化けてしまいます。
(アルファベットは化けません)

多分、UTF-8で外部ファイルへ書き込めていないからだと推測しています。

具体的には、どうすれば良いでしょうか?
どうぞよろしくお願い致します。
m(_ _)m

お礼日時:2011/05/07 07:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A