shellとWebでperlからphp(pukiwiki)を実行時、UTF8とBINARYとに扱いが異なる問題

このQ&Aのポイント
  • webからアクセスした際、表示が文字化けする問題が発生しています。どのように対処すれば解決できるでしょうか。
  • shellとWebからのアクセスでは、文字コードの扱いが異なるために文字化けが発生します。
  • pukiwikiのスクリプトの文字コードと出力はUTF-8であるため、文字化けが発生する原因を特定して対処する必要があります。
回答を見る
  • ベストアンサー

shellとWebでperlからphp(pukiwiki)を実行時、UTF8とBINARYとに扱いが別れ文字化けする問題

以下のスクリプトをshellから $perl test.cgi として実行時、保存するファイルとSTDOUTされる文字列は共に文字化けせず表示されます。 また、phpの実行結果の文字コードをnkfコマンドで調べますとUTF8です。 Webからアクセスした場合、保存されるファイルとSTDOUTされる文字列は共に文字化けします。 nkfではBINARYと表示されます。 pukiwikiで出力される内容は、aaaと言う名称に対して半角英数字と日本語が混じった形で表示されるようにしております。(<span>aあ</span>みたいな形) bashの環境は $ printenv LANG=ja_JP.UTF-8 です。 pukiwikiのスクリプトの文字コードと出力は共にUTF-8です。 --------------------------------------------- #!/usr/bin/perl use utf8; use open ":utf8"; use open ":std"; BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } print <<EOM; <HTML lang=ja > <HEAD> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <HEAD><BODY> EOM my$query_get; chdir '/.../pukiwiki/'; $query_get="aaa"; undef$ENV{'CONTENT_LENGTH'}; undef$ENV{'QUERY_STRING'}; undef$ENV{'REQUEST_METHOD'}; $ENV{'QUERY_STRING'} = $query_get; $ENV{'REQUEST_METHOD'} = 'GET'; `php /.../pukiwiki/index.php|lv -Ou8 >$query_get.cgi`; $t= `php /.../pukiwiki/index.php|lv -Ou8`; $val= `php /.../pukiwiki/index.php|nkf -g`; print $t; print "<br>"; print $val; print <<EOM; <BODY> <HTML> EOM 1; --------------------------------------------- やりたい事は、Webからアクセスした際、文字化けしないように表示させたいのですが、どのようにすれば可能でございますでしょうか また、shellとWebからでは、どうして文字コードの扱いが異なるのでしょうか どなた様かご教授ねがえませんでしょうか。宜しくお願いします。

  • taku0
  • お礼率80% (160/199)
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

> また、shellとWebからでは、どうして文字コードの扱いが異なるのでしょうか このご質問についてですが、一言で言えば、「違ってあたりまえ」です。 Shell の場合、化けないためには Shell 自身では無くて使用しているターミナルウィンドウの文字コードとプログラム(この場合は test.cgi)が STDOUT に出力する文字コードが一致している必要があります。 ターミナルウィンドウは、普通は文字コード固定です。 (ユーザーが設定できるものもありますが、実行中に自動的には切り替わりません) 一方で、Webの場合は、ブラウザ(InternetExplorer とか Firefox とか)の文字コードとWebサーバーから送られる (CGIが生成した)HTML の文字コードが一致している必要があります。 Webブラウザは、ページ毎に文字コードを切り換えるのが普通です。 切り替えの基準は以下のとおりですが、正しい切り替えに誘導するのはCGI設置者の責任です。 ・Content-Typeレスポンスヘッダ中の charsetパラメーター。 業界規格では最優先と決められています。 Content-Typeレスポンスヘッダは、CGIから出力できます。 CGIが省略すればWebサーバーが付けてくれますが、正しい charset が付くとは限りません。 (Webサーバーの設定や .htaccess で決まります) ・HTML内の METAタグ中の Content-Type の charset。 ブラウザによっては、これを最優先にしてるかも知れません。 規格違反ですが。 ・自動判定 Webページ作成者としては、これに頼るのはやめましょう。 以上を念頭に置いて、まずは「化けないシンプルなWebページ」を確実に作れる様になってから、改めて本来の目的での問題を考えられてはいかがでしょうか。

関連するQ&A

  • 文字コードEUCのPerlプログラムが文字化けしてしまいます

    Perlで書かれたCGIを実行しようとしているのですが、プログラムはEUCで記述されているそうです。nkf -g ***とするとEUC-JPとなります。 print " <META http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n"; とも記述されているのですが、ブラウザで実行(閲覧)すると文字化けして、ブラウザのエンコードは、Unicode(UTF-8)になっています。 ちなみに、OSはCentOS5.2です。 どうやったら、EUCで記述されたCGIが文字化けせずに実行できるのでしょうか? teratermでサーバに接続語、viコマンドで表示しても文字化けしています。ファイルの文字コードをEUCからUTF-8にして(nkf -w ***)、ブラウザでアクセスしても文字化けしてしまいます。

    • ベストアンサー
    • Perl
  • html + php 文字化けの問題【utf-8】

    文字化けが直りません。どうしたらいいでしょうか? phpとmysqlをつかってデータベース表示させるページなのですが、データベースの文字コードがutf-8なのでphpファイルの文字コードをeucからutf-8に変更しました。そうするとデータベースは正常に表示されるのですが、htmlの部分は全て「?」になってしまいます。 文字コードの変換はEmEditorで変更し、変化が見られなかったので、変換用のフリーソフトを使ってみましたが、やっぱり文字化けの状態です。どなたかご教授ください。お願いします。

    • 締切済み
    • PHP
  • PerlでRSS取得 ~ 文字化け ~ utf8→ShifJIS変換できない

    XML::RSSを使用してRSSのタイトルを取得するPerlスクリプトを作っています。 DBCSの場合、文字化けするので、以下のようにfrom_toを使用してutf8をShiftJISに変換しようとしましたが、エラーが出ます。 SBCSでは問題無いのですが。 Encode::Guessで調べるとutf8が返ってくるので、「from_to( $title, 'utf8','shiftjis' )」でutf8をShift-JISに変換すればよいのかと思ったのですが。 ■環境 ・perl v5.8.3 built for MSWin32-x86-multi-thread ・Windows2000(SP4) ■エラーメッセージ Cannot decode string with wide characters at c:/Perl/lib/Encode.pm line 184. ■ソース #!/usr/bin/perl BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } use Encode qw/ from_to /; use LWP::Simple 'get'; use XML::RSS ; print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD><meta http-equiv=\"Content-Type\" content=\"text/html;charset=Shift-JIS\"></HEAD>\n"; print"<BODY>\n"; my $rss = new XML::RSS; eval {   # $rss->parse( get('http://slashdot.org/slashdot.rdf') );    $rss->parse( get('http://oshiete1.goo.ne.jp/rss/oshiete_goo.xml') ); }; exit if $@; foreach my $ref( @{$rss->{items}} ) {   $title = $ref->{'title'};   $link = $ref->{'link'};   from_to( $title, 'utf8','shiftjis' );   print"[title] $title<br>\n";   print"[link] <a href=\"$link\" target=\"_blank\">$link</a><br>\n";   ----------------------------<br><br>\n"; } print"</BODY></HTML>\n"; RSSの取得方法はここを参考にしました。 http://www.rfs.jp/sb/perl/10/rss01.html 宜しくお願いします。

    • ベストアンサー
    • Perl
  • [perl5.8] utf8で文字出力すると文字化けする

    perl5.8で、テキストをunicode(utf8)で出力したのですが、文字化けします。 ソースは以下のとおりです。 -----ソース----- use open OUT => ":encoding(utf8)"; open(OUT, ">utf8.txt"); print OUT "utf8だよ\n"; close(OUT); ----------------- できたファイルはutf8エンコードなのですが、 エディタで見ると「だよ」が文字化けします。 ちなみにフリーソフトで、SJIS形式の「utf8だよ」が 書かれたファイルをutf8に変換すると、文字化けしません。 フリーソフトで生成したutf8ファイルと、 自作perlで生成したutf8ファイルとを バイナリエディタで読込み比較すると 75746638E381A0E382880D0A (フリーソフト) 75746638C282C2BEC282C3A60D0A (自作perl) という差が出ています。 原因がお分かりになる方、知恵をお貸し願えますか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • UTF-8で文字化けしないようにするには?

    Shift-jisのページだったのですがリニューアルを機に文字コードを utf-8に変更してページを作っています。 メールフォーム用のcgiは以前と同じものを使いたいのですがページを utf-8で作ったために送信すると文字化けしてしまいます。 cgi自体をutf-8で保存しましたが同じ結果でした・・・ 確認ページがあるわけでもなく必須の項目が埋まっていれば送信するような シンプルなものなのですがutf-8で文字化けしないようにするには どのように変更したらいいのでしょうか? ソースは以下の通りです。 #!/usr/bin/perl require "jcode.pl"; require "mimew.pl"; $SENDMAIL = '/usr/sbin/sendmail'; $MAILTO = 'mail@example.com'; $MAILSUBJECT = 'メールフォームより'; $query = $ENV{'QUERY_STRING'}; foreach $pair (split(/&/, $query)) { ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $form{$key} = $value; } $msg .= "----- 連絡先 -----\n"; ~~フォーム処理につき省略~~ if ($bad_input) { print <<END; Content-type: text/html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>エラー</title> </head> <body> <center> <h1>エラー</h1> <div>必須項目が入力されていません。</div> </center> </body> </html> END }else { $mail_to = mimeencode($MAILTO); $mail_from = mimeencode($form{'mail'}); $mail_subject = mimeencode($MAILSUBJECT); $body = jcode::jis($msg); $head = <<END; To: $mail_to From: $mail_from Subject: $mail_subject Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP END open (MAIL, "| $SENDMAIL -i -t -f $form{'mail'}") or die("Error: Can't open pipe for sendmail"); print MAIL $head, $body; close MAIL; print <<END; Content-type: text/html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>送信完了</title> </head> <body> <center> <h1>送信完了</h1> <div>下記の内容で送信しました.</div> <textarea cols="48" rows="24"> $msg </textarea> </center> </body> </html> END }

    • 締切済み
    • CGI
  • Perl+UTF8で文字化け

    以下の環境にてメール送信プログラムを作成していますが、 ありがちな文字化け、且、ボディーが表示されない不具合が発生しています。 サーバ:linux apache レンタルサーバ ※Encode.pm、Jcode.pm無し。モジュールインストール不可。 Perl version: 5.006001 ソースエンコード:utf-8 自分の解釈としてはutf8で記述しているので、 charset=utf-8にしておけば、 MIMEエンコードさえしてやれば 表示できると考えているのですが、 やはり甘い考えなのでしょうか? また、同サイト質問NO2868794も参考にさせていただきましたが、上手くいきません。 以下ソース(エンコード:utf-8) use utf8; use MIME::Base64; use POSIX; ※アドレス表記はこのサイトの投稿チェックに引っかかるので省略します。 my $to = 'XXXX@XXXX'.XXX; my $from_nm = "送信者名"; my $from_adr = "XXXXX@XXX.XXX"; my $subject = "メール表題"; my $body = "本文"; # 送信者名を MIME エンコード encode_base64($from_nm,""); # subjectを MIME エンコード encode_base64($subject,""); $subject = "=?utf-8?B?" . $subject . "?="; # 本文を MIME エンコード encode_base64($body); my $MailPass = "XXXX/XXXX/XXX"; #SendMail Pass open(MAIL,"| $MailPass -t"); #======================================================== print MAIL <<"EOF_MAIL"; From: $from_nm<$from_adr> To: $to Subject: $subject Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 MIME-Version: 1.0 $body EOF_MAIL #======================================================== close MAIL; その他、色々ググっては見たのですが、自分ではみつけられず、 どうかアドバイスありましたらよろしくお願いいたします。

  • UTF-8にしても文字化けが直らない

    XAMPPでPHPとMySQLを使っています。 しかし、そのまま使うと文字化けが起きてしまいます。調べると「UTF-8」にすることで文字化けが起こらないとのことなので変更をし、以下のように全てutf-8に書き換えることができました。 mysql> show variables like 'char%' -> ; +--------------------------+----------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | D:\program\xampp\mysql\share\charsets\ | +--------------------------+----------------------------------------+ しかし、それでも文字化けは直りませんでした。以下のコマンドで原因を確かめてみました。 mysql> use testdb; Database changed mysql> status -------------- Server characterset: utf8 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 Db characterset: latin1が原因だと思い、以下のコマンドを実行しました。 alter database testDB character set utf8; そしてもう一度テーブルを作りなおすと今度は文字化けどころか空白になってしまいました。 なにが原因で文字化け等が起こっているのか分かりません。助けてください。 OSは Windows Vista です。 バージョンは ApacheFriends XAMPP version 1.7.7 + Apache 2.2.21 + MySQL 5.5.16 (Community Server) + PHP 5.3.8 (VC9 X86 32bit thread safe) + PEAR です。 回答よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQL(UTF-8)で ~ が文字化けしてしまう

    いろいろと検索などして探してみたのですが、情報が得られず困っております。お分かりの方おられましたらご教示いただけると幸いです。 環境 Apache 2059 PHP 5.1.6 MySQL 5.0.24a WindowsXP SP2 PHPソース すべてUTF8書いてます。 HTML出力もヘッダーでUTF-8で表示しています。 my.cnfでは すべて default-character-set=utf8 で統一しています。 さらに、PHPからMySQLに接続したときに set names utf8; もしてます。 この環境で、 ~ のみが文字化けしてしまいます。 たとえば、 "あ~あ" とINSERTすると SELECTしてみると "あ?あ" となってしまいます。 ~以外の文字は問題ありません。 またPHP上で発行クエリ文を表示させると、まだ~となっているので、MySQL側の問題だとは思っているのですが、どう設定すればよいかわからないところです。 MySQL Query Browzerからでも同様になってしまいます。 ご存知の方おられましたら、情報よろしくお願いします。

    • ベストアンサー
    • MySQL
  • php+mysqlでINSERTで文字化けします。

    php+mysqlでINSERTで文字化けします。 mysqlの設定はutf8 phpのmbstringはutf8 クエリの中身をhtmlに出力したら正常に表示されています。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • charset=UTF-8 にすると文字化けしちゃいます!

    <META http-equiv=content-type content="text/html; charset=UTF-8"> とすると、ブラウザ(IE6)画面で見事に文字化けします。 アップロード先サーバーの都合上、UTF-8でなければなりません。 文字化けさせない方法をご教授くださいませ。 エディタはTeraPadとPeggyPad、OSはWinXPです。

専門家に質問してみよう