UTF-8エンコード時にスラッシュが上手く表示されません - PHPプロ!Q&A掲示板

1474

  • 500P

UTF-8エンコード時にスラッシュが上手く表示されません

質問日時 / 2008年9月3日 12:54    回答数 / 7件

Questioner:  123456789  このエントリーをはてなブックマークに追加 

キーワード / UTF-8    エンコード    スラッシュ   

宜しくお願い致します。

下記コードで$itemNameをUTF-8で取得しURLエンコード時にURLのスラッシュが変更はされるのですがページが上手く変更されません。

  1. $cut_length = 256;$itemName_str = mb_substr($value->itemName, 0, $cut_length); $url = "http://$_SERVER[SERVER_NAME]/index01/keyword/" . urlencode($itemName_str); print("<a href=\"{$url}/submit/%E6%A4%9C%E7%B4%A2.html\"><font color=\"808080\" basefont size=\"2\">$value->itemName</font></a>


.htaccessの中身です。
  1. Options +FollowSymLinks
  2. RewriteEngine on
  3. RewriteRule index01/keyword/(.*)/submit/(.*)\.html$ index01.php?keyword=$1&submit=$2

スラッシュ自体は文字コードを変換しておりますがURLがクリックしてもページが表示されません。
宜しくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01tezcelloURLの途中に %2F(スラッシュをURLエンコードした文字
 ┗A01-1123456789お教え頂いたもので出来そうなのですが色々試していま
  ┗A01-1-1tezcello当方の環境では、チャンとしたコードになっていません
   ┗A01-1-1-1123456789ご記載頂いた内容で問題無く動作致しました。 大変
    ┗A01-1-1-1-1tezcello提示しましたスクリプトの中で、%2F -> %252F と置き
     ┗A01-1-1-1-1-1123456789現在勉強中なのですが複数のコードを指定するのが難し
      ┗A01-1-1-1-1-1-1tezcello複数のコードを一度に指定する必要はありません。  

回答一覧

並び替え:

A01
answerertezcello [9月3日 15:25]

URLの途中に %2F(スラッシュをURLエンコードした文字列)が含まれると調子が悪いってやつです。
クエリに含まれている分には問題ないそうです。

apache %2F問題 でググるといろいろ見つかります。
参考まで、最上位のサイト
http://melog.info/archives/2007/09/25185557.html
では、%2F -> %252F と置き換えるっていう回避方法を提示されていますが、
うちの環境でやると、ブラウザ(FF3)上ではスラッシュになってくれないですね。

例示の mod_rewrite の置き換えをするなら、スラッシュをエンコードする必要はなさそうな気がします。
面倒ですが、一旦 urlencode してから、%2F を / に戻してしまうのはどうでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1
replyer123456789 [9月3日 15:36] (最終編集:9月3日 15:55)

お教え頂いたもので出来そうなのですが色々試していますが中々難しく現実的なソースを返信頂ければ大変助かります。

  1. $cut_length = 256;$itemName_str = mb_substr($value->itemName, 0, $cut_length); $url = "http://$_SERVER[SERVER_NAME]/index01/keyword/" . urlencode($itemName_str); print("<a href=\"{$url}/submit/%E6%A4%9C%E7%B4%A2.html\"><font color=\"808080\" basefont size=\"2\">$value->itemName</font></a>

上記に下記を組み込む方法をお教え頂ければと思います

  1. <$MTTagName encode_url="1" regex_replace="/%2F/","%252F"$>


恥ずかしいお話しですが書き込む場所が解りません・・・お手数ですが宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyertezcello [9月3日 17:25]

当方の環境では、チャンとしたコードになっていません。
以下のものだとしてお答えします。
  1. $cut_length = 256;
  2. $itemName_str = mb_substr($value->itemName, 0, $cut_length);
  3. $url = "http://$_SERVER[SERVER_NAME]/index01/keyword/" . urlencode($itemName_str);
  4. print "<a href=\"{$url}/submit/%E6%A4%9C%E7%B4%A2.html\"><font color=\"808080\" basefont size=\"2\">$value->itemName</font></a>";

組み込みたい部分はこの様に表示されるのでよくわかりません。
  1. <$MTTagName encode_url="1" regex_replace="/%2F/","%252F"$>

preg_replace() を使って、%2F -> %252F と置き換えるものとします。
  1. $cut_length = 256;
  2. $itemName_str = mb_substr($value->itemName, 0, $cut_length);
  3. $tmpstr = urlencode($itemName_str);
  4. $tmpstr = preg_replace('/%2F/i', '%252F', $tmpstr);
  5. $url = "http://$_SERVER[SERVER_NAME]/index01/keyword/" . $tmpstr;
  6. print "<a href=\"{$url}/submit/%E6%A4%9C%E7%B4%A2.html\"><font color=\"808080\" basefont size=\"2\">$value->itemName</font></a>";
これでいかがでしょうか?
チョッと時間が無いので脳内デバッグにつき、動作しなかったらごめんなさい。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyer123456789 [9月4日 12:23]

ご記載頂いた内容で問題無く動作致しました。

大変申し訳ございませんが後一つお願い致します。

今度は♯が%23となり表示されません♯を更に何とか出来ればと思っております。

現状ですと取得したURLより%23を取り除くと通常通りに動作いたします。

下記に♯を除く方法を記載するとすると何処に記載をすれば良いでしょうか?
大変お手数ですが宜しくお願い致します。

  1. $cut_length = 256; 
  2. $itemName_str = mb_substr($value->itemName, 0, $cut_length); 
  3. $tmpstr = urlencode($itemName_str); 
  4. $tmpstr = preg_replace('/%2F/i', '%252F', $tmpstr); 
  5. $url = "http://$_SERVER[SERVER_NAME]/index01/keyword/" . $tmpstr; 
  6. print "<a href=\"{$url}/submit/%E6%A4%9C%E7%B4%A2.html\"><font color=\"808080\" basefont size=\"2\">$value->itemName</font></a>";

上記が解決出来ましたらお礼のポイントを確定させて頂きます。
二度手間をお掛けし申し訳ございませんが宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyertezcello [9月4日 17:01]

提示しましたスクリプトの中で、%2F -> %252F と置き換えている部分はお分かりですよね?
同様にやればOKです。お試しください。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyer123456789 [9月5日 10:36]

現在勉強中なのですが複数のコードを指定するのが難しいのでコードを記載頂けると大変助かります。

お手数と思いますが宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1
replyertezcello [9月5日 14:26] (最終編集:9月7日 21:17)

複数のコードを一度に指定する必要はありません。   <- 「一度に」を追加 Sep.7 21:17 tezcello
置換の行を2回書くのが一番分かり易いです。
1回目は/を置換、2回目は#の置換をするだけです。


検索文字列、置き換え文字列のペアを複数指定することも出来ますが、そちらがよければ、
http://jp.php.net/manual/ja/function.preg-replace.php
の例2を参照ください。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)