- ベストアンサー
Perl utf8上でshiftjisをデコード
- Perlでutf8上でshiftjisをデコードする方法について教えてください。
- URLエンコードされた文字をUTF8としてブラウザに表示させたいが、正しく表示されない問題が発生しています。
- 環境はlinux apacheレンタルサーバで、Perlのバージョンは5.006001です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
はじめまして。 自分はperl5.8から使い始めたものです。 >require 'jacode.pl'; ええと、jcode.plの質問ですよね? そもそもjcode.plはutf8に対応してません。 use utf8プラグマも確かperl5.8以上じゃないと動作しなかったような…。 まぁnkfやiconvなどのUnicodeに対応済みの文字コードを変換するコマンドがあれば、perlからシェル呼び出して上手く変換できるかもですが、ソースコードの作りが面倒くさいと思います。 perl5.8以上インストールするか、レンタルサーバー変えたほうがいいと思います。 Encode.pmがあれば悩む必要がありませんよ、まぁ無理なのかもしれないでしょうけど。
その他の回答 (7)
- taco0603
- ベストアンサー率63% (21/33)
原因がUTF-8フラグであれば、文字化けも直りそうですね。 URLデコード前にUTF-8フラグが意図せず混入しているということで、予想ですがPerlモジュールかライブラリを使っていてその戻り値をpackしているんじゃないかなぁと。 XML::LibXMLなんかは戻り値をPerlの内部文字列で返してくれるので、ハマったことがあります。 頑張ってください。
お礼
色々試行錯誤しましたが、PerlでUTF8を制御するには5.8系以上を使わない駄目だという結論に至りました。 みなさま色々アドバイス頂きましてありがとうございました。 大変勉強になりました。 また、何かありましたら宜しくお願い致します。
補足
アドバイス有難うございました。 色々試行錯誤していますが、未だ解決できていません。 文字部分はとりあえず省略できるので、その他必要なステータスだけを拾い上げ、 文字をクッキーに保存して運用をしています。 現在調べようとしているのは、 ソースがeucベースにて渡される値を $moji = Encode::decode('shiftjis',$moji); $moji = Jcode->new($moji)->euc; とすると正常になるようなのですが、 当方の環境では使えないプラグマなので これに代わる機能は無いかと模索しています。 何か、アドバイスありましたらよろしくお願いします。
- taco0603
- ベストアンサー率63% (21/33)
どうやらDevel::Peekで出力結果をファイルに書き込みたいようですね。 参考URLの通り、PerlIO経由でSTDERRを開けば出来ますよ。 use Devel::Peek; my $stderr; close STDERR; open STDERR, ">", \$stderr or die $!; Dump $moji; print "stderr:{$stderr}\n";
補足
ありがとうございました。 お陰様で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)
DUMPがうまいいかないのなら、適当なテキストファイルに出力して確認したらどうでしょう? open OUT ">> debug.txt" ; # 処理前 print OUT $moji ,"\n" ; # デコードして print OUT $moji ,"\n" ; # convertして print OUT $moji ,"\n\n" ; みたいに。 そのあと、そのままodでダンプするとか、PCにコピーしてバイナリエディタで読むとかして、それぞれがどんなコードになっているか調べるとよいでしょう。
補足
アドバイス有難うございます。 おっしゃるようにファイル出力は行っていたのですが、 何故こうなるのか分からず途方に暮れていました・・・。 ・ファイル出力結果 URLエンコード前:%83%7D%83E%83X URLエンコード後:ツマツウツス (←ツは半角カナ、エディタはSHIFT-JIS) shiftjisからutf8へコンバート:†쎿슃†促茠††뿂茠⁏쎃側†쎿슃†促荛(エディタはUTF8) 試しに$moji="%83%7D%83E%83X";としてテキストを代入して行うと 「マウス」と正常に出力されます。
- kmee
- ベストアンサー率55% (1857/3366)
#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では無いとか、そんなことは無いでしょうか? あとは、画面表示だけの問題とかはないでしょうか?
お礼
補足です・・・。 私のソースに強制的にURLエンコード値(%83%7D%83E%83X)代入して 処理しましたら、正常に表示されました。 実際のURLエンコード値がどうやら「表示」と「保持」している値が違うようです・・・・。 何故こうなるのかが理解できません。 なにかアドバイスありましたら、よろしくお願いいたします。
補足
引き続きアドバイス有難うございます。 ご教授頂いた方法でしたら、おっしゃる通り正常に表示されました。 ・・・私のソース上で実行したURLエンコード文字列自体、 表示した限りでは同じ文字なのですが、 (表示した文字列をここに張り付けてました) その直後にURLエンコードするとおかしくなっているようです。 URLエンコード文字列に何かフラグが立ってしまっているのでしょうか? これをDUMPで調べようとしているのですが、それがうまくいかず苦戦してます。 表示としましては、ブラウザのエンコードを色々変更したり、CharSetを指定して行っているので、 恐らく大丈夫だと思いますが・・・。
- ariman_
- ベストアンサー率45% (27/59)
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で変換する記述に変更してみては如何ですか?
補足
アドバイス有難うございます。 ご指示通り、libディレクトリにJCODEソースを設置し、ソースを書き直して 実行してみました所、文字化けは以下のように変化しました。 †쎿슃†促茠††뿂茠⁏쎃側†쎿슃†促荛 Unicodeディレクトリも同様に設置してみましたが同じでした・・・・。 補足としまして。 文字をURLデコードのみで、shift-jisをそのまま表示してみると ツマツウツス (←ツは半角になります) となっていました。 元の文字に何かフラグ?が立ってしまっているのでしょうか? 元の文字がおかしいとどうしようも有りませんよね。 URLデコードがおかしいのでしょうか。
- taco0603
- ベストアンサー率63% (21/33)
No.1です。 jacode.plというライブラリあったんですね、勉強不足ですみません。 Perl5.8しか使ったこと無いんで、ごめんなさい。 で、ご提示のコードには特におかしいところは無さそうですが、まだ未解決なら、Devel::Peekで文字列をダンプしてスクリプトのどこの行で文字化けしてるか確認すべきかと。 何となくutf8プラグマが悪さしてる気がします。 頑張ってください。
お礼
いえいえ。アドバイス有難うございました。 XXXX.plはライブラリと呼ぶのですね。 勉強になりました。 Devel::Peekで問題個所を辿って、色々もがいてみます。 有難うございました。
補足
一つご教授ください。 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)
私もtaco0603さんの意見と一緒で、perlbrew等で別のPerlをインストールできるのであればインストールして できないのであれば、別のレンタルサーバに移った方がよいのではないかと思います。 そもそもPerl5.6.1って2001年4月リリースのものですから11年前のツールを使っていることになりますし… それでも、どうしてもそのレンタルサーバしか選択しがなく、 それでもこのバージョンじゃないといけない縛りがあるのでしたら… 参考になるかもしれないページが見つかったのでパスをはっておきますね。 http://www.hidekik.com/cookbook/p2h.cgi?id=utf8p56
お礼
早速アドバイス有難うございます。 環境自体は事情で変更する事ができません・・・。 なんとかjcodeと同じものをと探しているとjacodeがあったから使ってみたのですが、上手くいきません・・・。 私の使い方が悪いと思いたいのですが。 リンクは参考になりました。 これでもう少し勉強してみます。
補足
早速アドバイス有難うございます。 jcodeではなくて、jacode.plというモジュールが出ているので、使ってみたのですが・・・。 http://fsasaki.sakura.ne.jp/WikiFan/wiki.cgi?Perl%A5%E9%A5%A4%A5%D6%A5%E9%A5%EA%2Fjacode.pl あまり、まだ一般的ではないのでしょうか?