• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perl utf8上でshiftjisをデコード)

Perl utf8上でshiftjisをデコード

このQ&Aのポイント
  • Perlでutf8上でshiftjisをデコードする方法について教えてください。
  • URLエンコードされた文字をUTF8としてブラウザに表示させたいが、正しく表示されない問題が発生しています。
  • 環境はlinux apacheレンタルサーバで、Perlのバージョンは5.006001です。

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

  • ベストアンサー
  • taco0603
  • ベストアンサー率63% (21/33)
回答No.1

はじめまして。 自分はperl5.8から使い始めたものです。 >require 'jacode.pl'; ええと、jcode.plの質問ですよね? そもそもjcode.plはutf8に対応してません。 use utf8プラグマも確かperl5.8以上じゃないと動作しなかったような…。 まぁnkfやiconvなどのUnicodeに対応済みの文字コードを変換するコマンドがあれば、perlからシェル呼び出して上手く変換できるかもですが、ソースコードの作りが面倒くさいと思います。 perl5.8以上インストールするか、レンタルサーバー変えたほうがいいと思います。 Encode.pmがあれば悩む必要がありませんよ、まぁ無理なのかもしれないでしょうけど。

cinquecent
質問者

補足

早速アドバイス有難うございます。 jcodeではなくて、jacode.plというモジュールが出ているので、使ってみたのですが・・・。 http://fsasaki.sakura.ne.jp/WikiFan/wiki.cgi?Perl%A5%E9%A5%A4%A5%D6%A5%E9%A5%EA%2Fjacode.pl あまり、まだ一般的ではないのでしょうか?

その他の回答 (7)

  • taco0603
  • ベストアンサー率63% (21/33)
回答No.8

原因がUTF-8フラグであれば、文字化けも直りそうですね。 URLデコード前にUTF-8フラグが意図せず混入しているということで、予想ですがPerlモジュールかライブラリを使っていてその戻り値をpackしているんじゃないかなぁと。 XML::LibXMLなんかは戻り値をPerlの内部文字列で返してくれるので、ハマったことがあります。 頑張ってください。

cinquecent
質問者

お礼

色々試行錯誤しましたが、PerlでUTF8を制御するには5.8系以上を使わない駄目だという結論に至りました。 みなさま色々アドバイス頂きましてありがとうございました。 大変勉強になりました。 また、何かありましたら宜しくお願い致します。

cinquecent
質問者

補足

アドバイス有難うございました。 色々試行錯誤していますが、未だ解決できていません。 文字部分はとりあえず省略できるので、その他必要なステータスだけを拾い上げ、 文字をクッキーに保存して運用をしています。 現在調べようとしているのは、 ソースがeucベースにて渡される値を $moji = Encode::decode('shiftjis',$moji); $moji = Jcode->new($moji)->euc; とすると正常になるようなのですが、 当方の環境では使えないプラグマなので これに代わる機能は無いかと模索しています。 何か、アドバイスありましたらよろしくお願いします。

  • taco0603
  • ベストアンサー率63% (21/33)
回答No.7

どうやらDevel::Peekで出力結果をファイルに書き込みたいようですね。 参考URLの通り、PerlIO経由でSTDERRを開けば出来ますよ。 use Devel::Peek; my $stderr; close STDERR; open STDERR, ">", \$stderr or die $!; Dump $moji; print "stderr:{$stderr}\n";

参考URL:
http://www.donzoko.net/cgi-bin/tdiary/20060208.html
cinquecent
質問者

補足

ありがとうございました。 お陰様でDUMPをファイルに出力することが出来ました。 結果は以下の通りとなり、 どうやらURLデコードしてもUTF8フラグが立っている?ようでした。 【URLデコード前】 SV = PV(0x87359bc) at 0x853264c REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8) PV = 0x86e5b40 "%83%7D%83E%83X"\0 CUR = 14 LEN = 15 【URLデコード後】 SV = PVMG(0x85dede0) at 0x853264c REFCNT = 1 FLAGS = (PADBUSY,PADMY,SMG,POK,pPOK,UTF8) IV = 0 NV = 0 PV = 0x872ef50 "\302\203}\302\203E\302\203X"\0 CUR = 9 LEN = 15 MAGIC = 0x8751120 MG_VIRTUAL = &PL_vtbl_mglob MG_TYPE = 'g' MG_LEN = -1 まだよくわかっていませんが、これからコードについて調べたいと思います。 何かアドバイスありましたらお願いします。 有難うございました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.6

DUMPがうまいいかないのなら、適当なテキストファイルに出力して確認したらどうでしょう? open OUT ">> debug.txt" ; # 処理前 print OUT $moji ,"\n" ; # デコードして print OUT $moji ,"\n" ; # convertして print OUT $moji ,"\n\n" ; みたいに。 そのあと、そのままodでダンプするとか、PCにコピーしてバイナリエディタで読むとかして、それぞれがどんなコードになっているか調べるとよいでしょう。

cinquecent
質問者

補足

アドバイス有難うございます。 おっしゃるようにファイル出力は行っていたのですが、 何故こうなるのか分からず途方に暮れていました・・・。 ・ファイル出力結果 URLエンコード前:%83%7D%83E%83X URLエンコード後:ツマツウツス (←ツは半角カナ、エディタはSHIFT-JIS) shiftjisからutf8へコンバート:†쎿슃†促茠††⃃뿂茠⁏쎃側†쎿슃†促荛(エディタはUTF8) 試しに$moji="%83%7D%83E%83X";としてテキストを代入して行うと 「マウス」と正常に出力されます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

#4の方法で use lib qw(./lib); use Jcode; moji="%83%7D%83E%83X" ; $moji =~ s/%(..)/pack("c",hex($1))/ge; # Jcode::convert(\$moji, "utf8","sjis"); print $moji,"\n"; 単純にこれだけのスクリプトを動かしたらどうなります? 手許に5.6は無いので完全な再現にはなりませんが、Shift_JISでマウスと出力されました。 コメントを外せばUTF-8になりました。 $mojiに入っているURLエンコードが間違っているとか、実は元がShift_JISでは無いとか、そんなことは無いでしょうか? あとは、画面表示だけの問題とかはないでしょうか?

cinquecent
質問者

お礼

補足です・・・。 私のソースに強制的にURLエンコード値(%83%7D%83E%83X)代入して 処理しましたら、正常に表示されました。 実際のURLエンコード値がどうやら「表示」と「保持」している値が違うようです・・・・。 何故こうなるのかが理解できません。 なにかアドバイスありましたら、よろしくお願いいたします。

cinquecent
質問者

補足

引き続きアドバイス有難うございます。 ご教授頂いた方法でしたら、おっしゃる通り正常に表示されました。 ・・・私のソース上で実行したURLエンコード文字列自体、 表示した限りでは同じ文字なのですが、 (表示した文字列をここに張り付けてました) その直後にURLエンコードするとおかしくなっているようです。 URLエンコード文字列に何かフラグが立ってしまっているのでしょうか? これをDUMPで調べようとしているのですが、それがうまくいかず苦戦してます。 表示としましては、ブラウザのエンコードを色々変更したり、CharSetを指定して行っているので、 恐らく大丈夫だと思いますが・・・。

  • ariman_
  • ベストアンサー率45% (27/59)
回答No.4

Jcode.pmのバージョン0.88をダウンロードして、 http://search.cpan.org/~dankogai/Jcode-0.88/ 解凍して、Jcode.pm、Jcodeディレクトリをlibディレクトリを作成して、その中に入れます。 それを、実行ファイルと同じ場所に設置し、 (それだけでは駄目な場合は、Unicodeディレクトリもlibディレクトリ内に設置) 実行ファイルは、初めに書かれた記述の use utf8; require 'jacode.pl'; を use lib qw(./lib); use Jcode; に変更し、jcode::convertは、Jcode::convertとJcodeで変換する記述に変更してみては如何ですか?

cinquecent
質問者

補足

アドバイス有難うございます。 ご指示通り、libディレクトリにJCODEソースを設置し、ソースを書き直して 実行してみました所、文字化けは以下のように変化しました。 †쎿슃†促茠††⃃뿂茠⁏쎃側†쎿슃†促荛 Unicodeディレクトリも同様に設置してみましたが同じでした・・・・。 補足としまして。 文字をURLデコードのみで、shift-jisをそのまま表示してみると ツマツウツス (←ツは半角になります) となっていました。 元の文字に何かフラグ?が立ってしまっているのでしょうか? 元の文字がおかしいとどうしようも有りませんよね。 URLデコードがおかしいのでしょうか。

  • taco0603
  • ベストアンサー率63% (21/33)
回答No.3

No.1です。 jacode.plというライブラリあったんですね、勉強不足ですみません。 Perl5.8しか使ったこと無いんで、ごめんなさい。 で、ご提示のコードには特におかしいところは無さそうですが、まだ未解決なら、Devel::Peekで文字列をダンプしてスクリプトのどこの行で文字化けしてるか確認すべきかと。 何となくutf8プラグマが悪さしてる気がします。 頑張ってください。

cinquecent
質問者

お礼

いえいえ。アドバイス有難うございました。 XXXX.plはライブラリと呼ぶのですね。 勉強になりました。 Devel::Peekで問題個所を辿って、色々もがいてみます。 有難うございました。

cinquecent
質問者

補足

一つご教授ください。 Devel::Peekを使って解析しようとしているのですが、 これ自体がうまく出力されません。 アドバイス頂けませんでしょうか? ---------------------------------------------------------- # hogeをダンプしてdump.txtに出力させる。 use Devel::Peek; open(OUT, "> ./dump.txt"); # ファイルを開く $old = select(OUT); # 標準の出力先を OUT に変更 print Dump($hoge); select($old); # 標準の出力先を元に戻す close(OUT); ---------------------------------------------------------- 何か出てくれたら解決の糸口にもなるのですが、 何も出力されません。 出力先をSTDOUTに戻しても同様です。 何か間違っているのでしょうか・・・。

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

私もtaco0603さんの意見と一緒で、perlbrew等で別のPerlをインストールできるのであればインストールして できないのであれば、別のレンタルサーバに移った方がよいのではないかと思います。 そもそもPerl5.6.1って2001年4月リリースのものですから11年前のツールを使っていることになりますし… それでも、どうしてもそのレンタルサーバしか選択しがなく、 それでもこのバージョンじゃないといけない縛りがあるのでしたら… 参考になるかもしれないページが見つかったのでパスをはっておきますね。 http://www.hidekik.com/cookbook/p2h.cgi?id=utf8p56

cinquecent
質問者

お礼

早速アドバイス有難うございます。 環境自体は事情で変更する事ができません・・・。 なんとかjcodeと同じものをと探しているとjacodeがあったから使ってみたのですが、上手くいきません・・・。 私の使い方が悪いと思いたいのですが。 リンクは参考になりました。 これでもう少し勉強してみます。

関連するQ&A