• 締切済み

utf-8コードの指定

以下のURLにて同じ質問をしました。 http://soudan1.biglobe.ne.jp/qa4938782.html その時は解決したと思ったのですが、私の勘違いでした。 Undefined subroutine &main::Jcode called at listpage.pl line 220, line 855. というエラーからして、 $value = Jcode($value)->utf8; という記述そのものの問題ではなく、jcode.pmが認識されていないということなのでしょう。 でもプログラムの最初には use Jcode; としてあるし、パスが通っていないことも考えて#!(何と呼ぶんだったっけ?)も #!/usr/bin/perl -I /usr/lib としました。perl.exeをd:\usr\bin/に置いて /usr/bin/perl で良いなら、jcode.pmはd:\usr/libにあるからパスはこれで良いですよね!? ちなみにこのディレクトリにはcgi.pmも置いていますが、cgi.pmは普通に動いてます。 何が問題だと考えられますか? お手数をお掛けします。

  • Perl
  • 回答数2
  • ありがとう数1

みんなの回答

  • sample_
  • ベストアンサー率76% (20/26)
回答No.2

ちょいと調べてみました。 上記のエラーは、モジュールの読み込みには成功しているが Jcodeモジュールとして Jcode($value)->utf8; のような使い方がない為 あなたのコードにJcodeって名前のサブルーチン(&main::Jcode)が定義されてませんよ。 ってエラーがでてますね。 こうすると、質問者様の期待する挙動に近づきます。 my $obj = Jcode->new($text); #オブジェクトを生成。$textは変換前の文字列 $text = $obj->utf8(); #utf8に変換する。 前回のコメントに >つまり送られてくるフォームデータがどの文字コードか分からないわけです。となると、ここでは >$str2 = Jcode->new( $str1, "utf8")->sjis; >のようなコードは使えません。 とありましたが、本来文字コードの変換というのは、 必ず何の文字コードから何の文字コードに変換するか 指定しないといけません。 いや、指定しなくてもできてますが?? と、思うかもしれませんが、それはこういうことなんです。 たとえば、ひらがなの「あ」は、 shift_jisだと82A0 EUC-JPならA4A2 utf8なら3042 と、いった文字コードになります。 これは、shift_jis/EUC-JP/utf8のみで考えると 他のどの文字の文字コードとも重なりません。 つまり、3042という文字コードが来たら「あ」がきたな わかり、これはshift_jisで送られてきたんだな。 と、判別しているわけです。 つまり、文字コードを指定しなくても変換してくれる仕組みは、 送られてきた文字の中に他のどの文字コードとも重ならない文字が あるからそれをもとに判別して変換をしているというわけです。 逆に言えば短い文字列で他の文字コードと重複しているような文字が 送られてきたら判別ができないので、間違った文字を返します。 例えばshift_jisで半角のああ「アア」を送ると、半角カナのあは B1なのでB1B1と送られてきます。 プログラム側がutf8なんかで書いているとまずutf8の文字コードで B1B1にあたる文字があるか探し始めるんで、「臼」って文字を返してきます。 いわゆる、文字化けの仕組みです。 このようなことが起きるので、文字化けを完全に防ぎたいならば 変換前の文字コードを決めてしまわないと文字化けをおこす可能性があります。 じゃ、どうするかといったばあい方法は、二つ。 ブラウザから送られてくる文字コードは何がくるかわかりません。 サイトの指定するコード以外は、文字化けを起こすものとして無視する。 二つ目。 文字化けの仕組みで説明したように、文字コードが重複しない文字を inputタグのtype="hidden" value=""←にしかけておいて その文字でまず文字コード判別をおこない それを変換前の文字コードとする。なんてことが考えられます。 いかがでしょうか?

makoji
質問者

補足

ありがとうございます。確かにエラーはでなくなりました。 ところが可笑しいんです。というのは「こじこじ」を受け付けないのです。「こじこじ」とは登録者名。調べてみるとshift-JISの「こじこじ」をコードはそのままUTF-8で受け取っているようです。試しにタイトルと本文も「こじこじ」にしたところ、3つとも「□□・・・・」と□の羅列になってしまいました。 疑問が2点。 まず、フォームがどのようなコードで送られてきてもそれをUTF-8に変換するのがJcodeモジュールの仕事ですから、   my $obj = Jcode->new($value); $value = $obj->utf8(); は機能していないことになりますが、ではチェックポイントはどこになるのでしょう。 次に、送信フォームを記述する際は秀丸エディタで文字コードをUTF-8に設定してから作業に入りましたし、当然コード中には <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> と文字コードを記述しています。なのに何故shift-JISなのでしょう。 どうも雲を掴むようで、どうやってバグを探せばいいのか分からない状態です。 お手数ですをお掛けします。

回答No.1

Jcode() ではなく jcode() では。

参考URL:
http://search.cpan.org/~dankogai/Jcode-2.07/Jcode.pm

関連するQ&A

  • Jcode.pmについて

    ネット上からダウンロードしてきたCGIプログラム内で、Jcode.pmを使用しているようなのですが、サーバ にUpしたところ、以下の様なエラーが表示されました。 ※1 Can't locate Jcode.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl .) at access/accview.cgi line 68. ※2 BEGIN failed--compilation aborted at access/accview.cgi line 68. ちなみに、accview.cgi line 68には use Jcode; と書かれていました。 エラーの原因として、何がありますか? また、その解決法を教えていただきたいです。

    • ベストアンサー
    • Perl
  • ワーニング? encoding.pm

    perlで以下のようなエラーが出るのですが、これを出ないようにするにはどうしたらよいのでしょうか? Constant subroutine DEBUG redefined at c:/usr/lib/encoding.pm line 8. Subroutine _exception redefined at c:/usr/lib/encoding.pm line 23. Subroutine in_locale redefined at c:/usr/lib/encoding.pm line 34. Subroutine _get_locale_encoding redefined at c:/usr/lib/encoding.pm line 36. Subroutine import redefined at c:/usr/lib/encoding.pm line 89. Subroutine unimport redefined at c:/usr/lib/encoding.pm line 156.

    • ベストアンサー
    • Perl
  • 文法はあってるのにサーバーエラーが出る

    perlで構文チェックをしたところ、OKが出たので、 アパッチにて実行したところサーバエラーがでました。 調べたところ、以下のようなエラーが出ましたが、これは、サブルーチンや、ライブラリが呼出されていないのでしょうか?どのように対処すればいいか教えてください。 Premature end of script headers: c:/www/public_html/subsub.cgi Undefined subroutine &jcode::convent called at c:\WWW\PUBLIC~1\SUBSUB.CGI line 8. Premature end of script headers: c:/www/public_html/okikae.cgi Can't locate cgi-bin.pl in @INC (@INC contains: C:/usr/local/lib C:/usr/local/site/lib .) at c:\WWW\PUBLIC~1\OKIKAE.CGI line 3.

    • 締切済み
    • CGI
  • フォームの送信ボタンを押すと

    どなたか、お助けいただければ幸いです。 メールフォームを設置し、いざ送信テストをしようと 思ったのですが、送信をする際に下記のようなエラーがでます。 対処方法を教えてください(@´_`@)フエーン □エラーメッセージ□ Software error: Can't locate Jcode.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl/5.6.0/i386-linux /usr/lib/perl5/site_perl/5.6.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.6.1/i386-linux /usr/lib/perl5/vendor_perl/5.6.1 /usr/lib/perl5/vendor_perl .) at mailform.cgi line 8. BEGIN failed--compilation aborted at mailform.cgi line 8. というような、エラーです。このエラーは当方は初めて見るエラーでして、どのように対処すればわかりません。。。 □8行目記載内容□ use Jcode; のみです。 □フォーム設置ツリー□ ../inquiry/index.html ../cgi/toiawase/mailform.cgi ../cgi/jcode.pl   ↓ここから下は同ディレクトリーです。 ../cgi/cgi-lib.pl という中身で設定しております。 □環境□ IBM Xserver(Xeon 2.4GHz) Redhat Linux DirectAdmin Apache1.3.29 もし、この件でこの内容がなければ対処ができないとのことであれば、 何なりとおっしゃってください。 よろしくお願いします。。。

    • ベストアンサー
    • CGI
  • 解決法が見つかりません。

    フォームで入力した内容を担当者宛てにメールを送るプログラムを作っています。 以下のエラー文が出ました。 Can't locate Jcode/_Classic.pm in @INC (@INC contains: /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0 .) at Jcode.pm line 40. 何となく、「Jcode/_Classic.pm」が見つからない事は解るのですが、コレが何なのか、どこに何をどうすればいいのか全くわかりません。

    • ベストアンサー
    • Perl
  • cgiがうまく動作しません。

    はじめまして。 現在独学でlinuxの勉強をしている者です。検索をしたり本を読んだりして対策を試みたのですがどうしても解決できないため、質問させていただきます。 環境は redhatlinux9 Apache2.0.40 です。 cgiを置いたディレクトリにブラウザでアクセスすると、 Internal Server Error と出てしまいます。 ログを見ると、 [error] 6099: ModPerl::Registry: Can't locate ./jcode .pl in @INC (@INC contains: /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/li b/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/pe rl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.0/i3 86-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_per l /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0 .) at /var/w ww/cgi-bin/bbs/wforum.cgi line 11.! と表示されています。試しにwforum.cgiの11行目以下の require './jcode.pl'; require './fold.pl'; require './wf_init.cgi'; を require 'jcode.pl'; require 'fold.pl'; require 'wf_init.cgi'; と変更してみたところ、今度は (略)Can't locate fold.pl(略) at /var/www/cgi-bin/bbs/wforum.cgi line 12.! というエラーログが表示されました。 perlプログラムの文法、パーミッション、改行コード、FTP転送の際の転送モードは確認済みのため、問題ないと思われます。また、ここの過去ログを参考にして作成した #!/usr/bin/perl print<<EOF Content-type: text/html <HTML><BODY>CGI works Good.</BODY></HTML> EOF というtest.cgiは動作可能でした。 こういった場合、どのような原因が考えられるでしょうか。どうかご教授ください。よろしくお願いします。

  • jsRSSの設置方法について【NEW】

    jsRSSの設置方法について【NEW】 サーバーに大黒屋さんのcgi設置に苦戦しているところです。 http://www.daikoku-ya.org/perl/jsrss.php 現在ロケットネットのサーバーを使用しています。 http://rocketnet.jp/ ロケットネットサーバー基本構造 ---------------------------------------------------- ・ ・ bin/ cgi-bin/   ← cgiはこちらで動作 httpdocs/   ← htmlファイルなど通常のアップロード httpsdocs/ ・ ・ ---------------------------------------------------- という構造になっています。 ファイルの入れ替えや、パスの書き換えを 何度もやりましたがまったく動きません ^^; 希望としてはこのように出力できたら言うことはないのですが。 http://www.com-haus.net/ ちなみに新しい記事に【NEW】という画像を設置できたりしますか? (HTML・CSSの知識はあります) でも、先ずはcgi設置がうまくいかないとどうしようもありません。 どなたか最初から丁寧にご教授くださいませんか。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ◆jsRSS.cgi ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1行目  ---------これは問題ないと思います。 #!/usr/bin/perl 12行目~ ---------Jcodeがインストールされていなかったので           インストール後 cgi-bin/ に lib というフォルダを作り           JcodeフォルダとJcode.pmを置きましたが、パスは合っていますか? use lib './lib'; #use Jcode; use Socket; 16行目  ---------これは feed というフォルダに xml ファイルを入れるということでしょうか? my $dir_feed = 'feed'; 20行目~  ---------パス等、いまいち分かりません。 my $dir_temp = 'temp'; my $def_temp = 'jsRSS.tmp'; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ◆現在のサーバー設置状況です ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ cgi-bin │-----jsRSS │ │ │ │-----lib │ │ │ │ │ │-----Jcode │ │ │-----Jcode.pm │ │ │ │-----feed │ │-----temp │ │ │-----jsRSS.tmp │ │ │ │-----jsRSS.cgi │ httpdocs │-----index.html(rssを表示させるページ) │-----rss.xml http://www.自身のドメイン.com/cgi-bin/jsRSS/jsRSS.cgi でアクセスすると、 ------------------------------------ document.write(' RSSのurlを指定してください ', ''); ------------------------------------ のように表示されています。 どこにフォルダをアップしたらいいか パスの変更など丁寧にお教えいただけたら幸いです。 どうぞ、よろしくお願いいたします。

    • 締切済み
    • CGI
  • エラー内容がわかりません。Constant subroutine ~ undefined at ~

    CentOS 5.2, Perl 5.8.9の環境で Perlスクリプトを実行すると、以下のようなエラーが表示されます。 [Thu Jan 29 16:54:59 2009] [error] [client 192.168.112.191] Constant subroutine __USE_POSIX undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 8. [Thu Jan 29 16:54:59 2009] [error] [client 192.168.112.191] Constant subroutine __USE_POSIX2 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 9. [Thu Jan 29 16:54:59 2009] [error] [client 192.168.112.191] Constant subroutine __USE_POSIX199309 undefined at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/features.ph line 10. [Thu Jan 29 16:54:59 2009] [error] [client 192.168.112.191] ………… インターネットを調べたりしたのですが、なかなか有用な情報が得られませんでした。 strictプラグマが出しているようなのですが、理由がつかめません。 試しにCentOS 4.6で実行してみたところ何もエラーが表示されませんでした。 よろしくお願いいたします。

  • Can't locate R.pm in @INC

    perl初心者でまた質問させていただきます。 CGIを作っているのですが、R.PMが使えなくて困っています。 USE R; とすると、以下のようなエラーが出てしまいます。 Can't locate R.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/lib/perl5/site_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl .) at /srv/www/htdocs/cgi/ringo.cgi line 5. BEGIN failed--compilation aborted at /srv/www/htdocs/cgi/ringo.cgi line 5. Premature end of script headers: ringo.cgi そこで、 locate R.pm で、場所を探しました。 /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi/R.pm ということで、 use R '/usr/lib/perl5/5.10.0/x86_64-linux-thread-multi/'; このように変えてみたものの、同じエラーです。ちなみに、CGIではなく、PERLのプログラムからだと、use R;で動作することは確認しました。 よろしくお願いします。

    • 締切済み
    • CGI
  • 非常に見にくいです.....

    このジャンルであっているかどうか微妙ですが質問させていただきます。 よくフリーのCGIやPHPなどのテキストファイルをダウンロードしたとき、アップロード時に転送モードが悪かったのかどうか知りませんが、よく #!/usr/bin/perl↑↑require './jcode.pl';↑require './cgi-lib.pl';↑↑..................... のように改行部がすべて↑になってますよねぇ? もし「戻りページ」など設定しなければならない部分があったりする時は非常に見にくくやりづらいのです。 そこでこの上の例を自動で #!/usr/bin/perl require './jcode.pl'; require './cgi-lib.pl'; に書き換えてくれるようなソフトがあったら教えて下さい!!

    • ベストアンサー
    • CGI

専門家に質問してみよう