• 締切済み

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は普通に動いてます。 何が問題だと考えられますか? お手数をお掛けします。

みんなの回答

  • 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