
以下の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件)
- 最新から表示
- 回答順に表示
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=""←にしかけておいて
その文字でまず文字コード判別をおこない
それを変換前の文字コードとする。なんてことが考えられます。
いかがでしょうか?
この回答への補足
ありがとうございます。確かにエラーはでなくなりました。
ところが可笑しいんです。というのは「こじこじ」を受け付けないのです。「こじこじ」とは登録者名。調べてみると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
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Strawberry Perl for Windows ...
-
INDIRECT 横に再度抽出したい
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
perlで2次元配列をサブルーチ...
-
Perlの全角スペース 文字化け?
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonエラー
-
文字コードについて
-
BASP21によるbase64のデコード...
-
jisコードで16進数の『3c』か...
-
メール(iso-2022-jp-2)のデコ...
-
quoted-printableのアルゴリズム
-
IMAP4でsubjectが検索ヒットしない
-
CASLIIの数値データ入出力
-
標準入力からのutf-8→euc-jpで...
-
Perl:ファイル名だけ文字化けする
-
文字コード? 推奨UTF-8?
-
エンコード方法についての質問
-
Jcodeモジュールの代わりにjcod...
-
1つのサイトで文字コードが混在...
-
メールを文字化けしないように...
-
「繝・せ繝・」となる文字化け
-
Lite.pmを使ったメールで文字化け
-
MIMEでエンコードされたMailのS...
-
perlの日本語文字コードはどう...
-
Encodeモジュールで日本語化したい
おすすめ情報