• ベストアンサー

URLエンコーディングで悩んでいます。

関係者のみのページから特定のページにリンクさせる際に ダミーのリファーを飛ばしてリンクするシステムを作っています。 link.php の内容(EUC) <? $url = $_GET['url']; ?> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <html> <body> 下のURLへリンクします。よろしければクリックしてください。<BR> <a href="<? echo $url; ?>"><? echo $url; ?></a> </body> </html> このスクリプトを引数url http://search.yahoo.co.jp/search?p=%E4%BB%8A%E6%97%A5%E3%81%AF%E8%89%AF%E3%81%84%E5%A4%A9%E6%B0%97&fr=top&src=top (URLエンコードされた文字列)を与えて起動すると URLエンコードされた部分が文字化けしてしまいます。 渡された引数をそっくりそのまま表示し文字化けさせずに表示させることはできないのでしょうか。

  • PHP
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
回答No.4

以下,サンプルです。もう少しスマートなやり方があるかもしれませんが、それは専門家の方に(?・・)ル(^^*)ノ タッチw <?php $url = $_GET['url']; // ?で分割 list($urlbase, $initarg) = explode("?", $url); // =で分割 list($param, $value) = explode("=", $initarg); // URLエンコード $value = urlencode($value); // 分岐先生成 $jumpto = $urlbase . "?" . $param . "=" . $value; ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> <br> 下のURLへリンクします。よろしければクリックしてください。<BR> <a href="<?php print $jumpto; ?>"><?php print $url; ?></a> </body> </html>

YUTAKUN007
質問者

お礼

リンク文字列が文字化けしてしまうので 合体させて下記の落ち着いたとおもったんですが、 1番目の引数しか処理されないですねぇ。 2番目にエンコード対象があると処理されません。 難しいですが、いくつかヒントを頂けましたので 頑張ってみます。 ありがとうございました。 <?php $url = $_GET['url']; // ?で分割 list($urlbase, $initarg) = explode("?", $url); // =で分割 list($param, $value) = explode("=", $initarg); // URLエンコード $value = urlencode($value); // 分岐先生成 $jumpto = $urlbase . "?" . $param . "=" . $value; $disp = mb_convert_encoding(urldecode($url),"EUC-JP","UTF-8"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> <br> 下のURLへリンクします。よろしければクリックしてください。<BR> <a href="<?php print $jumpto; ?>"><?php print $disp; ?></a> </body> </html>

その他の回答 (3)

回答No.3

urlが不特定の時には、 先ほども書いたように、parse()関数を使用するか、?記号で引数を分割して、後者をURLエンコードすればいいと思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

<? $url = $_GET['url']; $disp = mb_convert_encoding(urldecode($url),"EUC-JP","UTF-8"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> 下のURLへリンクします。よろしければクリックしてください。<BR> <a href="<?php print $url; ?>"><?php print $disp; ?></a> </body> </html> ---------------------------------------------------------------- というようなことでしょうか? 勘違いしてたらすみません。

YUTAKUN007
質問者

補足

この場合は$urlが文字化けしてしまいます。 なかなか難しいですねぇ。

回答No.1

url部分と、引数部分(?から後ろ)を分けてやれば以下のように文字化けしません。 <?php $url = $_GET['url']; $arg = $_GET['arg']; $jumpto = sprintf("%s?p=%s", $url, urlencode($arg)); $jumptolist = sprintf("%s?p=%s", $url, $arg); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> 下のURLへリンクします。よろしければクリックしてください。<BR> <a href="<?php print $jumpto; ?>"><?php print $jumptolist; ?></a> </body> </html> urlを一括指定するときには、parse_url()を使用して、プログラム側で再構成してあげればいいかと思います。

参考URL:
http://jp.php.net/manual/ja/function.parse-url.php
YUTAKUN007
質問者

補足

引数に渡されるURLは不特定多数のものですので常にp=で来るとは限りません。 エンコードされた部分のみを処理することはできないのでしょうか。 説明の仕方が悪かったと思います。 本当に申し訳ありません。

関連するQ&A

  • ■URLのエンコードについて

    ■URLのエンコードについて お世話になります。 ■URLのエンコードについて 下記PHPで書いてありますが、google、Firefoxでは正しく移動(表示)できますが IEでは正しく表示できません。 $body .= "<A href='search.php?maker=$col[maker]'>" . substr($col[maker], 0, 50) ."</A> " . "($col[cnt]件)"; 文字コードはEUC-JPですが IEでもできるように教えていただけないでしょうか? 大変困っております。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • リダイレクト時のURLクエリ文字列の取得

    hoge.html <html> <head> <meta http-equiv="content-type" content="text/html; charset=euc-jp" /> </head> <body> <script language="javascript"> <!--// function windowOpen() { window.open("hoge.php?name=" + document.getElementById("data").value, "new_window"); } --> </script> <input type="text" id="data" /> <input type="button" value="new window" onclick="windowOpen()" /> </body> </html> hoge.php <html> <head> <meta http-equiv="content-type" content="text/html; charset=euc-jp" /> </head> <body> <?php echo $_GET['name']; ?> </body> </html> このようなスクリプトがあった時(表示の際の文字コードは任意で)、 文字列をエンコードせずJavaScriptからURLをリダイレクトさせている為、 IE6では、PHP側の$_GET['name']が正常に受け取る事が出来ません。 (Firefoxではアクセスした時点で自動的にURLエンコードしてくれるので 問題ないのですが) これを、JavaScript側でURLエンコードさせてからリダイレクトさせるのではなく、 PHP側で回避させる為にはどういった作業をどういう手順で行えばいいのでしょうか?

    • ベストアンサー
    • PHP
  • FedoraCore3のPCのアパッチを起動し

    /var/www/html/x.php: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML lang="ja"> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=euc"/> </HEAD> <BODY> <?php echo "おはようございますbr/>"; ?> </BODY> </HTML> をgeditで作成し このPC(192.168.1.4)とルータ接続している他のWindowsMeのPC(192.168.1.2)から ie6で表示させると文字化けがしてしまいます エンコードをEucにしても直りません どうしたら正常に表示されるようになるのでしょうか?

  • URLエンコード  文字数について

    URLエンコード  文字数について <a href="mailto:info@example.com?subject=%96%e2%82%a2%8d%87%82%ed%82%b9">メールはこちらへ</a> などHTMLの記述で文字化けを防ぐために下記文字列のように %96%e2%82%a2%8d%87%82%ed%82%b9 日本語をエンコードしていますが、ある一定以上の文字数を入力すると、そのリンクをクリックしてもメールソフトが起動しません。 文字数の制限があるのでしょうか? 詳しい方いらっしゃいましたら教えて下さい。 宜しくお願いします。

    • ベストアンサー
    • HTML
  • メールエンコーディングについて

    sendmail において テキストファイル(sample.txt)を作成し To: ***@***.***.com From: ****@****.com Subject: 夏休みの予定 ここから本文です これでおわりです とし、JIS 又は EUC-JP に iconv し cat sample.txt | sendmail -t として送信した場合、MUA で受信した時に どうして文字化けしないのでしょう? 本来でしたら、Subject は Subject: 夏休みの予定 の”夏休みの予定”をエンコードして Subject: =?iso-2022-jp?B?GyRCMkY1WSRfJE5NPURqGyhC?= とし ボディ部に関しては MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-2022-jp" としなければならない筈と思うのですが。。。 どういう原理が働いているのでしょうか?

  • canonicalのURLエンコードについて

    ネットで無料配布されているAmigodatabaseというPerlで、データベースのサイトを作っております。 以下は、データベースの結果一覧を出力するための、default.htmlというページのソースの一部です。 print <<"<!---HTML--->"; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML lang="ja"><HEAD> <link rel="canonical" href="$FORM{$SEARCH{1}{Name}}.htm"> (中略) <META name="description" content="$FORM{$SEARCH{1}{Name}} の名産果物です"> <TITLE>$FORM{$SEARCH{1}{Name}} の果物</TITLE> 上記、$FORM{$SEARCH{1}{Name}}には、 検索した際に使ったキーワードが表示自動挿入されます。 このキーワードが、例えば「りんご」だった場合に、 URLエンコードを行って、「%e3%82%8a%e3%82%93%e3%81%94」と 上記、<link rel="canonical" href="$FORM{$SEARCH{1}{Name}}">の $FORM{$SEARCH{1}{Name}}を、%e3%82%8a%e3%82%93%e3%81%94として、 つまり、<link rel="canonical" href="%e3%82%8a%e3%82%93%e3%81%94.htm"> としたいのですが、どのようなソースを書けば、実現できるのでしょうか? どうかアドバイスのほど、よろしくお願い致します。m(_ _)m

  • 一般的な方法で『URLエンコード』ができません・・・

    よろしくお願いいたします。 テキストボックスに入力(「こんにちは」など)した値をもとに、Yahooで検索させたいのですが、以下の方法でエンコードしました。 sub url_encode($) { my $str = shift; $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $str =~ tr/ /+/; return $str; } そうしたところ、「/」や「:」も別の文字「%2f」「%3a」に変換されてしまい、Yahooのページが開きません。 ちなみにYahooで「こんにちは」と検索すると、URLが以下のようになります。 http://search.yahoo.co.jp/search?p=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF&ei=UTF-8&fr=top_v2&x=wrt&meta=vc%3D テキストボックスに「こんにちは」と入力すして検索ボタンをクリックすると、上記のように変換させたいのです。 どのようにしてエンコードしたらよろしいのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • エンコードされたURLをGETメソッドで受け取るには?

    ttp://localhost/urltest.php?url=ttp://search.auctions.yahoo.co.jp/jp/search/auc?p=%A5%AC%A5%E4%A5%EB%A5%C9&auccat=0&alocale=0jp&acc=jp 上記のURLで ttp://localhost/urltest.phpの if(isset($_GET['url'])){ $itemsStr = ($_GET['url']); } print $itemsStr; で受け取りたいのですが、 ttp://search.auctions.yahoo.co.jp/jp/search/auc?p= までしか取得できません。 %A5%AC%A5%E4%A5%EB%A5%C9 の部分が取り出せないようです。%Aだけを受けとることはできるのですが、それ以上長くエンコードされた文字を受け取ろうとすると ttp://search.auctions.yahoo.co.jp/jp/search/auc?p= までしか受け取れません。 他のエンコードを含んだURLも同様でした。 記述したURLは頭のhを取っているので注意してください。省略されてしまうので。 php5.1.4です。 どなたか御存じの方いらっしゃいましたらご教授お願いします。

    • ベストアンサー
    • PHP
  • HTML・PHPの文字化け

    こんにちは。 PHPとMySQLを使ってショッピングカートを作ろうと思ったのですが、しょっぱなから躓いてしまいました・・・。 index.htmlでメタを <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> とeuc-jpにしたのですが、サーバーにアップすると文字化けしてしまいます。 表示のエンコードで確認するとシフトーJisになっています。eucにするとちゃんと表示されるのですが、更新するとやはり文字化けします。PHP・MySQLがeucですので、困っています。 どうにか対処方法はないでしょうか?ご教授をよろしくお願いします。

    • ベストアンサー
    • HTML
  • OSとURLエンコードの関係

    メールに参照としてサイトのURLを記載することがありますが、URLをクリックしても WEBブラウザが起動しないことがよくあります。メールS/WはThunderbirdです。 例: http://www.….jp/index.php?%A5%C1%A5%A7%A5%C3%A5%AF%A5%EA%A5%B9%A5%C8 ※アドレスは編集済 質問(1) 下記の通り推測しておりますが、考えは正しいでしょうか? 考えられる要因としては、全角文字を含むアドレスをサーバがURLエンコードするとOSに 依存したアドレスが生成され、例えば、UNIXサーバでURLエンコードされたアドレスをWindowsの クライアントが開く場合、Windowsがデコードする文字コードが異なるため、正しくデコードできず、 ブラウザが起動しない。 のではないかと考えております。 質問(2) OSのURLエンコード、デコードの関係は下記で正しいでしょうか? また、質問(1)が正しいとすると、文字コード同士の互換性はないということでしょうか?  UNIX … EUC  MAC … SJIS  Windows … Unicode 質問(3) 質問(1)の解決方法はありますでしょうか? 長くなりましたが、ご教授のほどよろしくお願いいたします。

専門家に質問してみよう