Perl cgiの文字化けを直したい (UTF8)

このQ&Aのポイント
  • 現在、jcode.plを使用したShift JISで構成されていた Perlのcgi を UTF-8 に改造しています。フォームに書き込んだPAGETITLEを別ファイルへUTF-8で書きこむ際に、文字化けしてしまいます。
  • 以下のPerlのPAGETITLEをどのように改造すれば、文字化けしないで、$foundations_fileへUTF-8で書き込みすることができるのでしょうか?※個人的にはデータ書き込みの sub REGIST 以下を改造すれば良いのではと推測していますが、どうやれば良いのか分かりません。
  • どうかご教示、よろしくお願い致します。m(_ _)m
回答を見る
  • ベストアンサー

Perl cgiの文字化けを直したい (UTF8)

現在、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; }

  • mcse
  • お礼率55% (148/266)
  • Perl
  • 回答数12
  • ありがとう数12

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.9

どう「実際に Encode::decode を使ったのか」が疑問ですが.... 少なくとも, pack しただけでダメなのは文字数を考えれば明らかで, 「pack で得られた文字列を改めて UTF-8 として解釈し直す」というのは必須なはず. あと, 「フォームで出てくる」というときに, フォントなんかも問題になりえる. そもそも UTF-16 な出力をしているときに UTF-8 な出力をしちゃったらどう考えてもダメだし, あるいは「理由はさておき UTF-8 な文字コードを上手く扱えないフォントレンダラー」だったりするとやっぱり UTF-8 じゃダメだよね. ということは, 「フォームの表示を見る」だけではダメで, HTML (なり XHTML なり) のレベルで正しくなっているかどうかから考えなきゃならないような感じがします.

mcse
質問者

お礼

たびたびのご回答、誠にありがとうございました。 とても参考になります。 HTMLの設定は、以下のように全てUTF-8にしています。 ------------------------------- sub HEADER { print "Content-type: text/html; charset=utf-8\n\n"; #print "Content-type:text/html\n\n"; print <<"EOF"; <HTML><HEAD> <TITLE>管理ページ - 基本設定</TITLE> <META http-equiv="Content-Type" content="text/html; charset=utf-8"> <META http-equiv="Content-Script-Type" content="text/javascript"> <META http-equiv="Content-Style-Type" content="text/css"> <META http-equiv="imagetoolbar" content="no"> <META name="robots" content="none"> <META name="robots" content="noindex,nofollow"> <LINK rel="stylesheet" type="text/css" href="$css"> <SCRIPT Language="JavaScript"><!-- function clrinfo(){ window.open("./color.cgi","clrinfo","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=0,width=650,height=500") } //--></SCRIPT> </HEAD> <BODY topmargin="10" leftmargin="0" rightmargin="0" text="#333333" bgproperties="fixed"> ------------------------------- あと文字が化けて出てくる "$PAGETITLE" の記載してあるHTMLも、上記設定内に含まれているので、UTF-8の状態になっているはずです。 ------------------------------- <TABLE width="100%" border="0" cellspacing="0" cellpadding="0"><TR> <TD height="15"><HR width="100%" size="1" color="#cccccc"></TD> </TR></TABLE> <TABLE border="0" cellspacing="0" cellpadding="0"><TR> <TD height="30">最終更新日時 : <FONT class="g10pt" color="#003d84">$DATE_FOUNDATIONS</FONT></TD> </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> </TR><TR> ------------------------------- あと一息だと思うんですが・・・

その他の回答 (11)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

データをどう取り込んでるか知らんけど, 最悪 何を入力したらどう「化けた」出力が得られるか を調べて, あとは文字コードから「化け具合」を見付ければなんとかなるかもしれん. でも, 「REGIST」って何を意味するんだろう. resist のタイポじゃないよなぁ....

mcse
質問者

お礼

Tacosan様、ご回答ありがとうございました。 日本語を入力すると、化けてしまいます。 (アルファベットは化けません) 多分、UTF-8で外部ファイルへ書き込めていないからだと推測しています。 具体的には、どうすれば良いでしょうか? どうぞよろしくお願い致します。 m(_ _)m

関連するQ&A

  • tableにinclude fileを組み込んだら・・・

    <table cellspacing="0" cellpadding="0"> <tr> <td width="480"> <table width=470" cellspacing="0" cellpadding="0"> <tr> <td width="470">・・・・</td> </tr> </table> </td> </tr> </table> を <table cellspacing="0" cellpadding="0"> <tr> <td width="480"> <!--#include file="head.html"--> </td> </tr> </table> で head.html を <table width=470" cellspacing="0" cellpadding="0"> <tr> <td width="470">・・・・</td> </tr> </table> にした場合、中のtableの上下のスペースが異なってしまいます。 どなたか、解決方法を教えてください。

    • ベストアンサー
    • HTML
  • CGI Perl 画像の出し方

    <table border=1> <tr> <TD colspan="3"> <table width=100% cellpadding=0 cellspacing=0><tr> <TD colspan="2">$c_name[$seedno]</TD> </tr></table> </TD> </tr> <tr> <TD colspan="3" align="right"></TD> </tr> <tr> <TD nowrap colspan="3">$ap<br> $dp<br> </TD> </tr> </table> 今CGIを改造中なのですが 10行目の所に自作の画像を出したいのですがどうすれば良いのでしょうか?。 出す画像は、登録しているキャラ毎の画像を表示したいのです。 例えばAというキャラが出たらAキャラの画像、Bというキャラが出たらBキャラの画像という感じです。 上手く説明できませんが宜しくお願いします。

    • ベストアンサー
    • Perl
  • テーブル内のテーブルの高さを揃えたい。

    CGIの表示部分を改造中です。 下のソースをhtmlファイルにして見てもらったら判ると思うのですが、 <TABLE border="0"> <COL span="4" width="50"> <TR> <TD valign="top"> <TABLE border="0" cellpadding="0" cellspacing="1" bgcolor="#cccccc" height="100%"> <TR> <TD bgcolor="#ffffff">こんな風に</TD> </TR> </TABLE> </TD> <TD valign="top"> <TABLE border="0" cellpadding="0" cellspacing="1" bgcolor="#cccccc" height="100%"> <TR> <TD bgcolor="#ffffff">枠を置いたときに</TD> </TR> </TABLE> </TD> <TD valign="top"> <TABLE border="0" cellpadding="0" cellspacing="1" bgcolor="#cccccc" height="100%"> <TR> <TD bgcolor="#ffffff">100%のサイズ指定しても合わない高さを</TD> </TR> </TABLE> </TD> <TD valign="top"> <TABLE border="0" cellpadding="0" cellspacing="1" bgcolor="#cccccc" height="100%"> <TR> <TD bgcolor="#ffffff">ちゃんと揃えて配置したい</TD> </TR> </TABLE> </TD> </TR> </TABLE> 高さを100%にしても広がりませんでした。 どうにかして高さ(下の位置)を揃えることは出来ないでしょうか?

    • ベストアンサー
    • HTML
  • テーブル内いっぱいに

    comment: と txt box を配置したいのですが txt box が右側に小さく表示されます どうしたらいいでしょうか? <table width="100%" border="1" cellspacing="0" cellpadding="0"> <tr><td> <table width="100%" cellspacing="0" cellpadding="0"> <tr><td>comment:</td><td><input type="text" style="width:100%"/></td></tr> </table> </td></tr> </table>

    • ベストアンサー
    • HTML
  • 動く文字について

    以下のようなテーブルを作りたいと思っているのですが、borderを1にすると動く文字が表示されるのですが、0にすると表示されないんです。どうすれば動くようになりますか? <Table border="1" Width="666" Height="58" Cellspacing="0" Cellpadding="0"> <Tr> <Td RowSpan="2" Width="23%">1</Td> <Td> <MARQUEE scrollamount="1" scrolldelay="25" truespeed>123456789</MARQUEE> </Td> </Tr> <Tr> <Td> <MARQUEE scrollamount="1" scrolldelay="25" truespeed>987654321</MARQUEE> </Td> </Tr> </Table>

    • ベストアンサー
    • HTML
  • ヤフオクのテンプレートでバックグラウンドを使いたい

    今、オークション用のテンプレートを作ってるのですが、テーブルの背景に、 <table width="900" height="1000" border="0" cellspacing="0" cellpadding="0" background="http://000.com/000.png"> と言った感じで画像を背景に配置したいと考えていますが、どうやってもうまくいきません。 プレビュー表示の段階で、ソースコードを見てみたのですが、ちゃんと設定されているにもかかわらず、背景画像だけが表示されません。 別の方法で、 <div style="background-image:url(http://www.000.com/000.png);"> でも試して見ましたが、同じ結果でした。 背景画像の上に「商品説明」などの画像を重ねて配置したいので、どうにか上手くできる方法がありましたら是非教えて下さい。 ※上に重ねる画像だけが表示されます。 参考までに今編集中のソースを貼っておきます。 <center> <table width="900" height="1000" border="0" cellspacing="0" cellpadding="0" background="http://000.com/000.png"> <tr> <td align="center" valign="top"><br /> <center> <table width="650" border="0" cellspacing="0" cellpadding="0"> <tr> <td><img src="http://000.com/001.png"></td> </tr> </table> <table width="650" border="0" cellspacing="0" cellpadding="5"> <tr> <td><font color="#a00e15"><p align="left"> 商品説明 </p></font></td> </tr> </table> <br /> <br /> <br /> <table width="650" border="0" cellspacing="0" cellpadding="0"> <tr> <td><img src="http://000.com/002.png"></td> </tr> </table> <table width="650" border="0" cellspacing="0" cellpadding="5"> <tr> <td><font color="#a00e15"><p align="left"> 発送方法 </tr> </table> <br /> <br /> <br /> <table width="650" border="0" cellspacing="0" cellpadding="0"> <tr> <td><img src="http://000.com/003.png"></td> </tr> </table> <table width="650" border="0" cellspacing="0" cellpadding="5"> <tr> <td><font color="#a00e15"><p align="left"> お支払い方法 </p></font></td> </tr> </table> <br /> <br /> <br /> <table width="650" border="0" cellspacing="0" cellpadding="0"> <tr> <td><img src="http://000.com/004.png"></td> </tr> </table> <table width="650" border="0" cellspacing="0" cellpadding="5"> <tr> <td><font color="#a00e15"><p align="left"> 注意事項 </p></font></td> </tr> </table></td> </tr> </table> </center>

  • スタイルシートの書き方

    HPの中に以下のようなテーブルを並べて作っているのですが、後からまとめて編集しやすいようにCSSファイルを別に作ろうと思います。 自分であれこれ試してはいるのですが、スマートな(?)スタイルシートの書き方がいまいちわかりません。 どのように指定すればいいでしょうか? 因みに下のタグもかなり自己流な部分があるのではないかと思うので、おかしいところがあれば指摘してください。 よろしくお願いします。 ------------------------------------------------------ <table border="0" bgcolor="#000000" cellspacing="0" cellpadding="0"> <tr> <td> <table border="0" cellspacing="1" cellpadding="2" width="500"> <tr><td bgcolor="#ffffff" width="150">AAA</td><td>BBB</td></tr> </table> </td> </tr> </table>

    • ベストアンサー
    • CSS
  • tableをcssで表記したい

    下記のhtmlのスタイル部分をcssで表記したいのですが、 どのようにすればよいのでしょうか? tableの種類が一つの場合はできるのですが・・・ <table width="100" border="1" cellpadding="1" cellspacing="1" bgcolor="#AAAAAA"> <tr> <td width="30" bgcolor="#FFFFFF">a</td> <td ">b</td> </tr> </table> <br> <table width="50" border="2" cellpadding="2" cellspacing="2" bgcolor="#BBBBBB"> <tr> <td width="25" bgcolor="#CCCCCC">c</td> <td>d</td> </tr> </table>

  • テーブルの位置

    最初からテーブルを一番上に持ってくるにはどうしたら良いですか?CSSで設定するのでしょうか? 【】で囲ってある部分を最初から上にしたいのです。入れ子のようにしてテーブルを挿入すると必ず真中になってしまいます。 <table width=\"800\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\" height=\"500\"> <tr bgcolor=\"#FFFF00\"> <td valigin=\"top\" valign=\"top\" colspan=\"4\" height=\"64\">  </tr> <tr> <td colspan=\"3\" height=\"2\">  </td> </tr> <tr> 【<td width=\"170\"> <table width=\"170\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\"> <tr> <td> </td> </tr> </table>】 </td> <td width=\"238\" height=\"352\"> </td> <td width=\"197\"> </td> </tr> <tr> <td colspan=\"3\"> </td> </tr> </table>

  • テーブルの作り方をご教示ください

    図のようなテーブルを作りたいのですがどうすればいいのかわかりません。 図はエクセルで書きました。 ----------------------------------------------- <table border=0 cellspacing=0 cellpadding=0> <tr> <td> <table border=0 bgcolor="#000000" cellspacing=1 cellpadding=1 width="230"> <tr bgcolor="#FFFFFF"> <td> 1 </td> </tr> <tr bgcolor="#FFFFFF"> <td> 2 </td> <tr bgcolor="#FFFFFF"> <td> 3 </td> </table> </td> </tr> </table> ----------------------------------------------- まではわかったのですが、 3と4を区切る方法がわかりません。 ご回答よろしくお願いします。

    • ベストアンサー
    • HTML

専門家に質問してみよう