電子書籍の厳選無料作品が豊富!

以下の環境にてURLエンコード(shiftjis)された文字を、UTF8として
ブラウザに表示させたいのですが、上手く表示されません。

環境:
サーバ:linux apache レンタルサーバ
※Encode.pm、Jcode.pm無し。追加モジュールインストール不可。
Perl version: 5.006001
ソースエンコード:utf-8

実行ソース:
------------------------------------
use utf8;
require 'jacode.pl';

# $mojiに予めURLエンコードされた文字が格納されています。
# 例として「マウス」デコード前(%83%7D%83E%83X)とします。

#URLデコード
$moji =~ s/%(..)/pack("c",hex($1))/ge; 

#デコードされたsjis文字をUTF8へコンバート
jcode::convert(\$moji, "utf8","sjis");

print ($moji);

-----------------------------------

例のように「マウス」と言う文字が$mojiに格納されている場合、
以下のような文字化けとなってしまいます。

ツマ燿セツス


正常にマウスと表示させるにはどうすればよろしいのでしょうか。
アドバイスを宜しくお願いします。

A 回答 (8件)

はじめまして。


自分はperl5.8から使い始めたものです。

>require 'jacode.pl';

ええと、jcode.plの質問ですよね?
そもそもjcode.plはutf8に対応してません。

use utf8プラグマも確かperl5.8以上じゃないと動作しなかったような…。

まぁnkfやiconvなどのUnicodeに対応済みの文字コードを変換するコマンドがあれば、perlからシェル呼び出して上手く変換できるかもですが、ソースコードの作りが面倒くさいと思います。

perl5.8以上インストールするか、レンタルサーバー変えたほうがいいと思います。
Encode.pmがあれば悩む必要がありませんよ、まぁ無理なのかもしれないでしょうけど。

この回答への補足

早速アドバイス有難うございます。

jcodeではなくて、jacode.plというモジュールが出ているので、使ってみたのですが・・・。

http://fsasaki.sakura.ne.jp/WikiFan/wiki.cgi?Per …

あまり、まだ一般的ではないのでしょうか?

補足日時:2012/10/21 23:12
    • good
    • 0

原因がUTF-8フラグであれば、文字化けも直りそうですね。



URLデコード前にUTF-8フラグが意図せず混入しているということで、予想ですがPerlモジュールかライブラリを使っていてその戻り値をpackしているんじゃないかなぁと。

XML::LibXMLなんかは戻り値をPerlの内部文字列で返してくれるので、ハマったことがあります。

頑張ってください。

この回答への補足

アドバイス有難うございました。

色々試行錯誤していますが、未だ解決できていません。

文字部分はとりあえず省略できるので、その他必要なステータスだけを拾い上げ、
文字をクッキーに保存して運用をしています。

現在調べようとしているのは、
ソースがeucベースにて渡される値を

$moji = Encode::decode('shiftjis',$moji);
$moji = Jcode->new($moji)->euc;

とすると正常になるようなのですが、
当方の環境では使えないプラグマなので
これに代わる機能は無いかと模索しています。

何か、アドバイスありましたらよろしくお願いします。

補足日時:2012/11/05 13:14
    • good
    • 0
この回答へのお礼

色々試行錯誤しましたが、PerlでUTF8を制御するには5.8系以上を使わない駄目だという結論に至りました。

みなさま色々アドバイス頂きましてありがとうございました。
大変勉強になりました。

また、何かありましたら宜しくお願い致します。

お礼日時:2012/11/17 09:48

どうやら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.h …

この回答への補足

ありがとうございました。
お陰様で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

まだよくわかっていませんが、これからコードについて調べたいと思います。
何かアドバイスありましたらお願いします。

有難うございました。

補足日時:2012/10/25 23:49
    • good
    • 0

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";としてテキストを代入して行うと
「マウス」と正常に出力されます。

補足日時:2012/10/23 23:37
    • good
    • 0

#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エンコード文字列自体、
表示した限りでは同じ文字なのですが、
(表示した文字列をここに張り付けてました)
その直後にURLエンコードするとおかしくなっているようです。
URLエンコード文字列に何かフラグが立ってしまっているのでしょうか?
これをDUMPで調べようとしているのですが、それがうまくいかず苦戦してます。

表示としましては、ブラウザのエンコードを色々変更したり、CharSetを指定して行っているので、
恐らく大丈夫だと思いますが・・・。

補足日時:2012/10/23 08:30
    • good
    • 0
この回答へのお礼

補足です・・・。

私のソースに強制的にURLエンコード値(%83%7D%83E%83X)代入して
処理しましたら、正常に表示されました。

実際のURLエンコード値がどうやら「表示」と「保持」している値が違うようです・・・・。
何故こうなるのかが理解できません。

なにかアドバイスありましたら、よろしくお願いいたします。

お礼日時:2012/10/23 08:37

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デコードがおかしいのでしょうか。

補足日時:2012/10/22 19:45
    • good
    • 0

No.1です。



jacode.plというライブラリあったんですね、勉強不足ですみません。
Perl5.8しか使ったこと無いんで、ごめんなさい。

で、ご提示のコードには特におかしいところは無さそうですが、まだ未解決なら、Devel::Peekで文字列をダンプしてスクリプトのどこの行で文字化けしてるか確認すべきかと。

何となくutf8プラグマが悪さしてる気がします。

頑張ってください。

この回答への補足

一つご教授ください。

Devel::Peekを使って解析しようとしているのですが、
これ自体がうまく出力されません。
アドバイス頂けませんでしょうか?

----------------------------------------------------------
# hogeをダンプしてdump.txtに出力させる。
use Devel::Peek;
open(OUT, "> ./dump.txt"); # ファイルを開く
$old = select(OUT); # 標準の出力先を OUT に変更
print Dump($hoge);
select($old); # 標準の出力先を元に戻す
close(OUT);
----------------------------------------------------------

何か出てくれたら解決の糸口にもなるのですが、
何も出力されません。

出力先をSTDOUTに戻しても同様です。
何か間違っているのでしょうか・・・。

補足日時:2012/10/22 15:16
    • good
    • 0
この回答へのお礼

いえいえ。アドバイス有難うございました。

XXXX.plはライブラリと呼ぶのですね。
勉強になりました。

Devel::Peekで問題個所を辿って、色々もがいてみます。
有難うございました。

お礼日時:2012/10/22 10:57

私もtaco0603さんの意見と一緒で、perlbrew等で別のPerlをインストールできるのであればインストールして


できないのであれば、別のレンタルサーバに移った方がよいのではないかと思います。
そもそもPerl5.6.1って2001年4月リリースのものですから11年前のツールを使っていることになりますし…

それでも、どうしてもそのレンタルサーバしか選択しがなく、
それでもこのバージョンじゃないといけない縛りがあるのでしたら…

参考になるかもしれないページが見つかったのでパスをはっておきますね。
http://www.hidekik.com/cookbook/p2h.cgi?id=utf8p56
    • good
    • 0
この回答へのお礼

早速アドバイス有難うございます。

環境自体は事情で変更する事ができません・・・。

なんとかjcodeと同じものをと探しているとjacodeがあったから使ってみたのですが、上手くいきません・・・。

私の使い方が悪いと思いたいのですが。

リンクは参考になりました。
これでもう少し勉強してみます。

お礼日時:2012/10/21 23:17

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