• ベストアンサー

UTF8 エンコード/デコード

http://okwave.jp/qa/q6746313.html で質問した者です。 どうもお答え頂いたエンコードと、ブラウザ様が勝手に行うエンコードのルールが違うようです。 Perlは全てutf8、出力するHTMLもutf8、ブラウザ様が勝手にエンコードしたデータはなんですかあれ? いろいろ試しましたが、なにをどうやっても文字化けします。

  • jelfe
  • お礼率86% (52/60)
  • CGI
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

昔作った検証用サンプルも入れときます 参考になれば幸いです [ファイル名:index.cgi:UTF-8]↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ #!/usr/bin/perl my $sDT = '漢字です'; my $sDT_URL = './test.cgi?T1='.URL_Encode($sDT); print <<HTML_BODY; Content-type: text/html\n\n <html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>TEST UTF-8</title> </head> <body> <p><a href="$sDT_URL">CLICK</a></p> </body> </html> HTML_BODY exit; ## URLエンコード sub URL_Encode{ my ($p01,@waste)=@_; $p01 =~ s/([^\w])/'%'.unpack('H2',$1)/eg; $p01 =~ tr/ /+/; return $p01; } ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ [ファイル名:test.cgi:UTF-8]↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ #!/usr/bin/perl my %hIN = readMethod(); my $ss = $hIN{T1}; print "Content-type: text/html\n\n"; print <<HTML_BODY; <html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>TEST UTF-8</title> </head> <body> 送信内容:$ss </body> </html> HTML_BODY exit; ## ******************************************************** ## メソッド読み込み ## ******************************************************** sub readMethod{ my %rm_in; my $paramPost; if($ENV{REQUEST_METHOD} eq 'GET'){ my @tmpPrmt = split(/&/,$ENV{'QUERY_STRING'}); foreach(@tmpPrmt){ my ($p1,$v1) = split(/=/,$_); $v1 =~ tr/+/ /; $v1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego; if(exists($rm_in{$p1})){ $rm_in{$p1} .= "\t".$v1; }else{ $rm_in{$p1}=$v1; } } }elsif($ENV{REQUEST_METHOD} eq 'POST'){ read(STDIN, $paramPost, $ENV{'CONTENT_LENGTH'}); my @tmpData=split(/&/,$paramPost); foreach(@tmpData){ my ($p1,$p2)=split(/=/,$_); $p1 =~ tr/+/ /; $p1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego; $p2 =~ tr/+/ /; $p2 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego; if(exists($rm_in{$p1})){ $rm_in{$p1} .= "\t".$p2; }else{ $rm_in{$p1}=$p2; } } }else{ print "die for error..."; } return %rm_in; } ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

jelfe
質問者

お礼

丁寧にありがとうございます。 perlのutf8解釈に問題があったみたいで、 入出力の際は全てutfフラグをつけたり外したりすることで解決しました。

その他の回答 (1)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

シチュエーションがよくわからないので的外れの回答かもしれませんが・・・ まず、CGIでURLエンコードが必要な状況というのはGETメソッドでのリンクを作りたい場合以外考えにくいのですが 通常、URLエンコードに文字コード云々は関係ないと思います ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ## URLエンコード sub URL_Encode{ my ($p01,@waste)=@_; $p01 =~ s/([^\w])/'%'.unpack('H2',$1)/eg; $p01 =~ tr/ /+/; return $p01; } ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 以上のサブルーチンで ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ my $sDT = '漢字です'; my $sDT_URL = './test.cgi?HOGEHOGE='.URL_Encode($sDT); ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ こんな感じで呼び出すだけです。 URLエンコードは7ビット以上のデータを便宜上7ビットコードの文字列で表現するだけのものなので文字コードの受け渡し前後で化けるならば、プログラム内部でのデータの扱いに問題があるからです。 よくある失敗パターンとして 1.プログラムがEUCやS-JISで書かれていて、変数内のデータでUTF-8を扱っていたりする場合(UTF-8で保存したあと修正などのためS-JISで開いてそのままセーブしてしまうパターン) 2.BOM付きコードを扱っている場合 3.モジュールを含むPerlのバージョンが古すぎて書かれているプログラムの文字コードが判別あるいは正常処理ができない 4.ファイルをサーバに転送する際に文字コードを変換している 5.HTMLでの表示時に「charset」や「Content-Language」をちゃんと指定していない 6.HTMLとCSSとJavaScriptで文字コードが統一されていない、又はそれを認識していても相互変換ができていない などでしょうか レンタルサーバなどでPerl5.8以前のものがいまだ使われていることもあるので要注意です。 CGIが動くならFUTOMIのサーバアナライザなどで環境を把握しておく方が良いでしょう。 ちなみにURLデコードは以下の通り ## URLデコード sub URL_Decode{ my ($p01,@waste)=@_; $p01 =~ tr/+/ /; $p01 =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge; return $p01; } 蛇足ですが、GETメソッドでデータの受け渡しには文字数制限や、アドレス欄に見えることで安全面に問題があるので、できるだけPOSTメソッドを使いましょう。

関連するQ&A

  • エンコード UTF-8 とは?

    「PC」からi phoneにメールを送ると「文字化け」します。 【iPhoneから送られたメールをWindows Mailとか Outlook Expressで見ると 正しくエンコードしなくて見られないことがあるのですが、それは エンコードでUTF-8を選択すれば見られるようになります。】 ↑同じような内容の質問が、 ネット上で検索かかったのですが、 そもそも「エンコード  UTF-8」とは何でしょうか? どのような設定をすれば良いでしょうか? 因みに私がPCからiphoneにメールを送ると 「文字化けしてて見えない」といわれます。 が、文字化けする時、しない時があります。

  • MySQL4.0 UTF-8 での文字化け

    こんにちは MySQL4.0 & PHP4.3 でHTMLは文字コードUTF-8で記述しています。 MySQL4.0の文字コード設定はレンタルサーバーのため不明ですが、 phpMyAdminで、utf-8にてデータを入力しました。 select文でMySQLのデータを拾ってくると文字化けはおきないのですが PHP経由でPOSTされた値を使ってinsertやupdateをかけると文字化けしてしまいます。phpMyAdmin上でも文字化けしていますが、phpMyAdminをEUC-JPにすると、入力した文字が文字化けせずに表示されます。 (が、すでに入っているデータは文字化けします、、、、) 入力画面は metaでUTF-8宣言をしており、ブラウザ(IE)上でエンコードを確認するとUnicode(UTF-8)になっています。4.1みたいにset names を指定するとうまくいくかな?と思ったのですが、やっぱり4.0なので結果は変わらず、でした。PHPのスクリプトそのものは、UTF-8で記述しているのですが、、、、 どういった項目をみなおせばいいのでしょうか?

    • ベストアンサー
    • MySQL
  • エンコード 日本語(JIS)が選べない

    教えてください。 Internet Explorer 9 を使用しています。 エンコード  Unicode(UTF-8)が選ばれており、 支障をきたしています。 http://okwave.jp/qa/q8078148.html 上記で支障をきたす理由記載。 日本語(シフト JIS)を選びたいのですが チェックを変えると文字化けしてしまい、 ホームに戻ってみると文字化けが解消されるとともに Unicode(UTF-8)にもどってしまいます。 自動選択にチェックいれてみたりためしましたが どうしてもUnicode(UTF-8)に勝手に戻ってしまいます。 日本語(シフト JIS)を設定するにはどうすればいいでしょうか? ヒントでも結構です! 宜しくお願い致します。

  • Perl utf8上でshiftjisをデコード

    以下の環境にて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に格納されている場合、 以下のような文字化けとなってしまいます。 ツマ燿セツス 正常にマウスと表示させるにはどうすればよろしいのでしょうか。 アドバイスを宜しくお願いします。

    • ベストアンサー
    • Perl
  • EUCのファイルを開くとUTF-8になる

    文字コードがEUCのperlで書かれたCGIをブラウザで表示すると、UTF-8となっています。(自動認識と設定していた場合) その場合は、文字化けしてしまいます。 ブラウザの文字コードをEUCに変更すると、文字化けせず表示されます。 perlプログラムは、EUCで書かれているのに、ブラウザでは(自動認識と設定していた場合)、UTF-8となる理由はどこにあるのでしょうか? perlプログラムでは、METAヘッダにEUC-JPと記述されています。 ちなみに、サーバのOSはCentOSです。(httpd.confでは、UTF-8が設定されています)

  • UTF-8 フラグ?で文字化けしました助けてください

    http://rev.go2.jp/MTAmazon.txt http://www.majordojo.com/projects/MTAmazon/downloads/ これなんですが 結論から言えば文字化けしてしまい困っています。 Movable Typeのplug-inなのですが構築すると上記のplug-inで出力した文字列のみが文字化けしないでその他の日本語文字列のみが化けます。 また、上記のplug-inで英数字のみの出力とした場合は正常に動作します。(文字化けしません) そして、設置するサーバーによって文字化けしなかったり、したりしています。Perlのバージョンの違うサーバーです。 どうやらPerlのせいと言うところまでは突き止めました。 そして、Perlの文字化け関連を漁っているとUTF-8フラグの存在が明らかになりました。 しかし、改造と言っても私に出来るのはコピペぐらいなので適当に先頭にuse utf8;とかplug-inのファイルをutf8エンドコードしてアップしてみたりuse encoding 'utf8';とか書いてみて全部文字化けしちゃったりして・・ でも手応えとしてはUTF-8フラグが問題なのかなという思いは強くしました。use encoding 'utf8';を追加する以外の改造は出力に変化はありませんでした。 # Perl のバージョン: 5.8.3 # Perl のバージョン: 5.8.7 サーバーは上記のPerlのバージョンで正常に動かしたいのです。 http://rev.go2.jp/は5.8.7の方のテスト環境です。出力した文字列以外が文字化けしている様が見られます。 http://rev.go2.jp/MTAmazon.txtはMTAmazon.plだけおいてみました。 よろしくお願いします

  • utf8フラグを外すと、日本語が化ける

    MySQLにPerlから登録させるプログラムを書いていて文字コードでハマってしまいました。 HTMLからpostされたデータを登録しても、そのまま日本語で保存されるのですが、以前に書き出しておいたデータファイルから読み込んだ文字が文字化けしてしまいます。 もちろんデータファイルはutf8で保存されており、またpostされたデータもutf8です。 そこで、utf8フラグのあたりが怪しいのでは、、と思い調べたところ、 postされた文字列はフラグなしのutf8、データファイルから読み込んだ文字列はフラグ付きのutf8でした。 それならばと、utf8::decode($str);をしてみたのですが、フラグは取れたものの肝心の文字列が文字化けしています。 文字化けした文字は、MySQLに化けて登録されたものと同一の化け方でした。 この状態で、どうすれば化けさせずに登録させられるでしょうか? Perlのバージョンは5.8.8です。 スクリプト自体もutf8です。 もし分かる方がいらっしゃればご教授願えると嬉しいです。

    • ベストアンサー
    • Perl
  • utf-8の文字列に対してURLエンコードを行なうには?

    最近 perlをutf-8で書き始めたのですが、文字コードではまっています。 cgiの内部から別のcgiへpostで全角文字を送る場合 URLエンコードしてから送ると思うのですが 文字コードがutf-8の時、どのようにURLエンコードしたら 良いのか分からず困っています。どなたかご存知でしょうか? ちなみに文字を受ける方のcgiでは以下の様にURLデコードしています。 $data =~ tr/+/ /; $data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; 試用しているperlのバージョンはperl5.8です、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 文字エンコードはをUTF-8にする方法

    文字エンコードはをUTF-8にする方法。 yahooジオシティーズを使って、HPを作っております。 素人ながら、アドバンストHTMLエディタを使い、ファイルマネージャーを使って、htmlで作っております。 HPの中で、google map を張り付けたいと思いましたが、文字のエンコードをUTF-8にしないと表示できないと聞きました。 どのようにすれば、文字のエンコードは変えることができますか? よろしくお願いします。

  • utf16の記号のutf8へのエンコード(もしくはマッチ又は削除)がう

    utf16の記号のutf8へのエンコード(もしくはマッチ又は削除)がうまくいきません。 お世話になります。 前々回、、、、 http://okwave.jp/qa/q6232556.html でUTF-16をUTF-8に変換する方法を教えていただきました。 (その節は、ありがとうございました) $name=~s/\\u([[:xdigit:]]{4})/chr eval "0x$1"/eg; が、この方法だと、記号が変換されず、例えば、、、 ●「~」 は 「\x{301c} 」 と表示され ●「・」 は 「\x{2022}」 と表示されてしまいます。 これらの記号のデコード方法が調べても分からなかったので、いっそ、削除しちゃえ!とばかりに、、、 「「x」から始まり「}」で終わる文字は根こそぎ削除!というプログラムを組み込んでみたのですが、まったく反応せず。 チェックの為に行った「x」だけの削除ですらマッチせず。。。。 (これでは反応しないはずですね。。。) ということで、utf16の「記号」のutf8へのエンコード(もしくはマッチ又は削除)の方法について、アドバイスいただければ幸いです。

    • ベストアンサー
    • Perl

専門家に質問してみよう