dポイントプレゼントキャンペーン実施中!

headerでほかのサイトに飛ばすとき、
header("Location: http://localhost/nani/success.php?tour=$_GET[tour]");

こんな感じでクエリを飛ばしているのですが、URLエンコーディングをする方法がわかりません。
ほかの変数($data)に入れるまえにurlencode($_GET[tour])として入れ替えて、
?tour=$_GET[tour]の部分を?tour=$dataとしたのですができません。

ご存知の方いらっしゃいましたら教えていただけませんでしょうか?

A 回答 (2件)

送り側と受け取り側のエンコードが違う場合はやり方は4つあります



(1)送り側は受け取り側で受け取れるエンコードを事前に理解し、
送る際に仕様にあわせたデータをおくる

(2)送り側で明示的にエンコード方式を受け取り側に伝えてやり
受け取り側がそれをみて判断する

(3)受け取り側が、送られてきたデータのエンコードを想像して
想定と違う場合は自動的に変換してやる

(4)受け取り側は、送られてくるデータのエンコードを特定のものと信じて
それ以外の場合は、あきらめる。

今回の質問者さんの例ですと(4)だったので、しかたなく(1)にした
ということですね。

スケーラビリティを考えれば、通常(2)を採用する場合が多いようです。
(3)は不正確な処理なので賢明とはいえません

//send.php
<?PHP
$tour=urlencode($_GET["tour"]);
$e=urlencode($_GET["e"]);
if($tour){
header("Location: reach.php?tour=".$tour."&e=".$e);
exit();
}
?>
<html>
<body>
<a href="?tour=%82%A0%82%A2%82%A4&e=sjis">SJIS</a><br>
<a href="?tour=%A4%A2%A4%A4%A4%A6&e=euc">EUC</a><br>
<a href="?tour=%E3%81%82%E3%81%84%E3%81%86&e=utf">UTF</a><br>
</body>
</html>

//reach.php → SHIFT JISを前提
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
<html>
<body>
<?PHP
mb_internal_encoding("SJIS");
$tour=$_GET["tour"];

switch($_GET["e"]){
case "euc":
$tour=mb_convert_encoding($tour,"SJIS","EUC");
break;
case "utf":
$tour=mb_convert_encoding($tour,"SJIS","UTF8");
break;
case "sjis":
case "":
break;
default:
$tour="";
}
print $tour;
?>
</body>
</html>
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
コードまで用意していただきありがとうございます。
コードはプリントアウトアウトして勉強させていただきました。
しっかり記憶しておきます。

読み返すたびに質問の仕方が悪かったと感じています。

私が組んだプログラムはクエリの受け手も送り手も
utf-8で組んでいたので、たぶん受けて側はutf-8とわかるだろうと思っていたのですがそうではないのでしょうね。
勉強になりました。ありがとうございます。

お礼日時:2011/07/13 09:41

なにがどうできないかわからないのでなんとも言えませんが・・・


普通に飛ぶような気がしますが?

<?PHP
header("Location: ttp://localhost/nani/success.php?tour=".urlencode($_GET["tour"])."");
?>
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>なにがどうできないかわからないのでなんとも言えませんが・・
関数headerのところで飛ばしたはずのクエリを読み取れなかったということです。

自己解決したのですが、utf-8だったから飛ばないと思っています。
shift_jisにしたらできました。
もしutf-8でもできるなら、できたということを教えていただきたいです。

お礼日時:2011/07/11 09:47

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