重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

以下の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は普通に動いてます。

何が問題だと考えられますか?

お手数をお掛けします。

A 回答 (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=""←にしかけておいて
その文字でまず文字コード判別をおこない
それを変換前の文字コードとする。なんてことが考えられます。
いかがでしょうか?

この回答への補足

ありがとうございます。確かにエラーはでなくなりました。

ところが可笑しいんです。というのは「こじこじ」を受け付けないのです。「こじこじ」とは登録者名。調べてみると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なのでしょう。

どうも雲を掴むようで、どうやってバグを探せばいいのか分からない状態です。

お手数ですをお掛けします。

補足日時:2009/05/14 18:49
    • good
    • 0

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



参考URL:http://search.cpan.org/~dankogai/Jcode-2.07/Jcod …
    • good
    • 0

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