![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_07.png?8acaa2e)
以下の環境にて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に格納されている場合、
以下のような文字化けとなってしまいます。
ï¾ãç¿ï½¾ï¾ã¹
正常にマウスと表示させるにはどうすればよろしいのでしょうか。
アドバイスを宜しくお願いします。
No.1ベストアンサー
- 回答日時:
はじめまして。
自分は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 …
あまり、まだ一般的ではないのでしょうか?
No.8
- 回答日時:
原因がUTF-8フラグであれば、文字化けも直りそうですね。
URLデコード前にUTF-8フラグが意図せず混入しているということで、予想ですがPerlモジュールかライブラリを使っていてその戻り値をpackしているんじゃないかなぁと。
XML::LibXMLなんかは戻り値をPerlの内部文字列で返してくれるので、ハマったことがあります。
頑張ってください。
この回答への補足
アドバイス有難うございました。
色々試行錯誤していますが、未だ解決できていません。
文字部分はとりあえず省略できるので、その他必要なステータスだけを拾い上げ、
文字をクッキーに保存して運用をしています。
現在調べようとしているのは、
ソースがeucベースにて渡される値を
$moji = Encode::decode('shiftjis',$moji);
$moji = Jcode->new($moji)->euc;
とすると正常になるようなのですが、
当方の環境では使えないプラグマなので
これに代わる機能は無いかと模索しています。
何か、アドバイスありましたらよろしくお願いします。
色々試行錯誤しましたが、PerlでUTF8を制御するには5.8系以上を使わない駄目だという結論に至りました。
みなさま色々アドバイス頂きましてありがとうございました。
大変勉強になりました。
また、何かありましたら宜しくお願い致します。
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.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
まだよくわかっていませんが、これからコードについて調べたいと思います。
何かアドバイスありましたらお願いします。
有難うございました。
No.6
- 回答日時:
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";としてテキストを代入して行うと
「マウス」と正常に出力されます。
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では無いとか、そんなことは無いでしょうか?
あとは、画面表示だけの問題とかはないでしょうか?
この回答への補足
引き続きアドバイス有難うございます。
ご教授頂いた方法でしたら、おっしゃる通り正常に表示されました。
・・・私のソース上で実行したURLエンコード文字列自体、
表示した限りでは同じ文字なのですが、
(表示した文字列をここに張り付けてました)
その直後にURLエンコードするとおかしくなっているようです。
URLエンコード文字列に何かフラグが立ってしまっているのでしょうか?
これをDUMPで調べようとしているのですが、それがうまくいかず苦戦してます。
表示としましては、ブラウザのエンコードを色々変更したり、CharSetを指定して行っているので、
恐らく大丈夫だと思いますが・・・。
補足です・・・。
私のソースに強制的にURLエンコード値(%83%7D%83E%83X)代入して
処理しましたら、正常に表示されました。
実際のURLエンコード値がどうやら「表示」と「保持」している値が違うようです・・・・。
何故こうなるのかが理解できません。
なにかアドバイスありましたら、よろしくお願いいたします。
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で変換する記述に変更してみては如何ですか?
この回答への補足
アドバイス有難うございます。
ご指示通り、libディレクトリにJCODEソースを設置し、ソースを書き直して
実行してみました所、文字化けは以下のように変化しました。
†쎿슃†促茠††뿂茠⁏쎃側†쎿슃†促荛
Unicodeディレクトリも同様に設置してみましたが同じでした・・・・。
補足としまして。
文字をURLデコードのみで、shift-jisをそのまま表示してみると
ツマツウツス (←ツは半角になります)
となっていました。
元の文字に何かフラグ?が立ってしまっているのでしょうか?
元の文字がおかしいとどうしようも有りませんよね。
URLデコードがおかしいのでしょうか。
No.3
- 回答日時:
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に戻しても同様です。
何か間違っているのでしょうか・・・。
いえいえ。アドバイス有難うございました。
XXXX.plはライブラリと呼ぶのですね。
勉強になりました。
Devel::Peekで問題個所を辿って、色々もがいてみます。
有難うございました。
No.2
- 回答日時:
私もtaco0603さんの意見と一緒で、perlbrew等で別のPerlをインストールできるのであればインストールして
できないのであれば、別のレンタルサーバに移った方がよいのではないかと思います。
そもそもPerl5.6.1って2001年4月リリースのものですから11年前のツールを使っていることになりますし…
それでも、どうしてもそのレンタルサーバしか選択しがなく、
それでもこのバージョンじゃないといけない縛りがあるのでしたら…
参考になるかもしれないページが見つかったのでパスをはっておきますね。
http://www.hidekik.com/cookbook/p2h.cgi?id=utf8p56
早速アドバイス有難うございます。
環境自体は事情で変更する事ができません・・・。
なんとかjcodeと同じものをと探しているとjacodeがあったから使ってみたのですが、上手くいきません・・・。
私の使い方が悪いと思いたいのですが。
リンクは参考になりました。
これでもう少し勉強してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Visual Basic(VBA) VBA シート上にドロップダウンリストを作り、予め指定値をセットしたいのですが 1 2023/03/25 15:15
- Excel(エクセル) 全角文字「ヴ」の半角文字「ヴ」への変換方法について 3 2022/11/05 12:07
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Android(アンドロイド) 海外のAndroid 端末の場合、日本語全角は、どう表示されるのでしょうか? 1 2022/10/02 21:16
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/15 08:30
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/04/21 08:59
- Visual Basic(VBA) VBA 画面上のカーソルに文字数字を入力するコードを教えて下さい 1 2022/10/30 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlをwindows環境でshift-jis...
-
[perl5.8] SJISで出力したはず...
-
複数種類の括弧でくくられてな...
-
Data::Dumper;でダンプ後表示し...
-
HTTP::Request::Common qw(POST...
-
VBAでCSVファイルの特定行を書...
-
VBAでCSVファイルを途中行まで...
-
batファイルでrenameができませ...
-
ExcelをCSV書き出す場合のシー...
-
awkスクリプトでダブルクォーテ...
-
DOSコマンドで、標準出力を出力...
-
Firefox で file:// で始まる U...
-
ファイル出力の改行コードをLFに
-
Perlの変数に文字数制限(容量...
-
fopenでディレクトリ内の全ファ...
-
[Perl]ファイル出力のエンコー...
-
同じようなソースなのですが片...
-
エクセルVBA コードが同じでも...
-
巨大なテキストの最終行を取得...
-
エクセルVBAで素数だけを出力す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perlをwindows環境でshift-jis...
-
Perl cgiの文字化けを直したい ...
-
perlでuse utf8でsjisのファイ...
-
HTTP::Request::Common qw(POST...
-
消費税の計算で 税込価格から...
-
does not map to shiftjis は解...
-
Perl:Unicodeプロパティ作れない
-
Perlでのファイル出力における...
-
Perl utf8上でshiftjisをデコード
-
複数種類の括弧でくくられてな...
-
Data::Dumper;でダンプ後表示し...
-
utf-8での日本語正規表現の書き方
-
[Perl]Shift-JISのXMLを解析する場
-
ファイル出力をUTF8Nではなくて...
-
perl5.8.3のunicode環境で日本...
-
perlで新規ファイルを作成でき...
-
perlでのtext読み込み
-
[perl5.8] SJISから読み込んだ~と
-
Perl 正規表現について
-
Perlを用いて、XMLファイルの中...
おすすめ情報