PHPでテンプレートに含まれるリンク先のエンコードと表示の不一致について

このQ&Aのポイント
  • 現在、PHP(EUC-JP)でプログラムを作成し、テンプレートはS-JISで表示しています。テンプレートにはリンク先が含まれており、リンク先に日本語の文字が含まれています。しかし、リンクをクリックすると、エンコードされたURLが表示されます。
  • URLの生成において、PHP以下をエンコードし、それをS-JISに変換しています。しかし、リンクをクリックすると、エンコードされたURLが表示されるという現象が起きています。
  • この現象が起こる原因はわかりませんが、エンコードされたURLがアラビア文字のように表示されるという報告があります。なぜこのような現象が起こるのか、ご教授ください。
回答を見る
  • ベストアンサー

文字コードについて

現在、PHP(EUC-JP)でプログラムを作成し、テンプレートはS-JISで表示しています。 テンプレートには下記のようにリンク先をはっています。 <a href="REPLACE">NAME</a> REPLACEとNAMEはPHP側で作成した値を置き換えています。 NAMEはmb_convert_encodingでEUC-JPをS-JISに変更していますが、リンク先には日本語の文字が含まれています。 私が、考えたものは次に遷移したいPHP以下をエンコードし、それをmb_convert_encodingするというものです。 $url="test.php?ID=".$stData[$i]['id'].&gStationName=".$stData[$i]['name']; $url_encode=urlencode($url); $all_data['test'] = mb_convert_encoding($url_encode, "SJIS", "EUC-JP"); このリンク先にカーソルをあてると、日本語はアラビア文字みたいなのが、表示されます。 しかし、このリンクをクリックすると、エンコードされたURLが表示されます。 なぜ、このような現象が起こるのでしょうか? ご教授ください。

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

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

  • ベストアンサー
  • sisya
  • ベストアンサー率39% (97/245)
回答No.2

テンプレートとはご自身で値を適用するための HTMLソースの事でしたか。 うまく飛ばないとの事でしたが、 いくらgStationNameの値がむちゃくちゃでも test.cgiと言うファイルが存在すれば 404にはならないと思います。 飛び先のURLが正しいかを確認したほうが良いかと思います。 更に補足要求になってしまうのですが、 ・アラビア文字のようなものはどこに表示されるのですか? ・エンコードされたURLはどこに表示されるのですか? #1補足から ・どのような値が入っているのですか? ・URLエンコード無しで現象が変化するか試しましたか?

aiurai54
質問者

お礼

最終的にはうまくいきました。 日本語のところだけをURLエンコードすると 無事に通りました。

その他の回答 (1)

  • sisya
  • ベストアンサー率39% (97/245)
回答No.1

まず、テンプレートを使用していらっしゃるようですが、 どのテンプレートエンジンを使っているか書かれないと 挙動がまったく予測できません。 判らないまま回答しますと、 urlencode関数を通した時点で2バイト文字(日本語)は すべてurlの規則に従って変換されるので、 すべて英数と%に変換されます。 その後mb_convert_encodingを行なっても 何も変化していないと予測されます。 ためしにmb_convert_encoding関数を通さずに URLを見てみてください。

aiurai54
質問者

補足

最初のやり方とは少し違った方法で値の受け渡しを行ったのですが、、、やはりうまくいきません。回答ありがとうございます。 テンプレートエンジンとは?というところから調べなければ、いけませんが、、 私の方法がテンプレートエンジンにあたるとは思うのですが、どのテンプレートエンジンをというと少しわかりません。 現在、HTML(テキストなどに)その挿入したい部分の文字列をstr_replaceで置換しています。これもテンプレートエンジンにあたるのでしょうか? 説明文が間違っていましたが、 DBから取得した値を 下記のようにLocationしています。 $url="test.php?ID=".$stData[$i]['id'].&gStationName=".$stData[$i]['name']; $url_encode=urlencode($url); header("Location: {$rtnUrl}"); 値は入っていますが、 うまくとびません。$stData[$i]['name'];などには日本語が含まれているため、エンコードしています。 エラーの内容としては, HTTP 404 - ファイル未検出 となります。

関連するQ&A

  • 文字コードの変換について

    現在、表示はPHPで文字コードはEUCで表示しています。 そのときには表示できるのですが、 表示したものを、SHIFT-JISにエンコードしてエクセルに表示するときに、文字コードの違いにより表示されないものがあります。 エンコードは $str = mb_convert_encoding($str, "SJIS", "auto"); と行っています。 EUCからSJISに変換するときに、何か特別なことを行う必要があるのでしょうか??

    • ベストアンサー
    • PHP
  • 自作メールフォームから送信するとメール内容がおかしくなる。

    ※PHP初心者なので、お手柔らかにお願いします。 自作メールフォームからメール送信すると、メールは送れるのですがメールの内容がおかしくなります。 現状は、件名のみ正しく表示され、差出人と本文の内容が空になります。 いろいろなサイトを見て試してみたのですが、どれも同じ結果で何が間違っているのかよくわからず困ってます。 メールの設定として下記を、 mb_language("Japanese"); mb_internal_encoding ("SJIS"); mb_detect_order("ASCII, JIS, UTF-8, EUC-JP, SJIS"); $MailTo = "送付先メールアドレス"; メール送信事態は下記ソースの通りです。 // エンコードして文字列を作成 $Name = mb_convert_encoding($Name, 'JIS', 'auto'); $Header = "From:" .mb_encode_mimeheader($Name). "<" .$Mail. ">\n"; $Subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding("お問い合わせ", 'JIS', 'auto')). "?="; $Message = mb_convert_encoding($Message, "JIS", "auto"); // メール送信処理 $Ret = mb_send_mail($MailTo, $Subject, $Message, $Header);

    • ベストアンサー
    • PHP
  • 文字コードの出力を変更したい

    http://www.netmania.jp/で配布されているPHPウェブログシステム2をサーバーで運用しようとしたのですが、ログ出力がShift-JISになっていたので、EUCに変えたいと思って、ソースを見てもさっぱり解りませんでした。 mb_convert_encoding等を検索してみても見つからないし、お手上げです。 どなたかご教授下さいませんか?

    • ベストアンサー
    • PHP
  • 文字コード変換

    初心者で、どう質問をすれば理解してもらえるか分かりませんが、 文字コードを出力先に合わせて "EUC-JP"と変換していのですがうまい事いきません。 <?php $str = "あああ"; $str = mb_convert_encoding($str, "EUC-JP", "auto"); echo $str; ?> というふうに書いても Fatal error: Call to undefinde function mb_convert_encoding() と出てきて、エラーがおきてしまいます。 ちなみにMS-DOSを使用してます 答えれる事は何でも答えますので何か、ほかに方法があれば教えてください。 お願いします。

    • 締切済み
    • PHP
  • EUC-JPのサイトをSHIFT-JISに変換するには?

    EUC-JPのサイトをSHIFT-JISに変換して表示したいのですが、うまくいきません。 どのへんが間違っているのか教えていただけないでしょうか? <?php header("Content-Type: text/html; charset=Shift_JIS"); //EUC-JPデコードされたURL $url = "http://www.hogehoge.com"; //ファイルとして読み込む $fileUrl = @readfile($url); //エンコードする $encUrl = urlencode($fileUrl); //SHIFT-JISに変換する $newUrl = mb_convert_encoding($encUrl, "Shift_JIS", "auto"); //表示する echo $newUrl; ?>

    • ベストアンサー
    • PHP
  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • 文字コード(UTF-8)文字化けについて

    以下のphpを実行したところ、入力した文字によって文字化けしたりしなかったりします。 どなたか原因が分かる方がいらっしゃったら教えてください。 (見、一は化けない。上、実は化ける。) phpはバージョン5.2.8を使用しています。 (コード)----------------------- <html lang="ja"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8" /> <head> </head> </body> <?php mb_language("Japanese"); mb_internal_encoding("UTF-8"); $org_text1 = "見"; $org_text2 = "上"; $org_text3 = "実"; $org_text4 = "一"; $telop_text1 = mb_convert_encoding($org_text1,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text2 = mb_convert_encoding($org_text2,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text3 = mb_convert_encoding($org_text3,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text4 = mb_convert_encoding($org_text4,'utf-8','ASCII, JIS, EUC-JP,SJIS'); echo "telop_text1="; echo $telop_text1; echo "<br>"; echo "telop_text2="; echo $telop_text2; echo "<br>"; echo "telop_text3="; echo $telop_text3; echo "<br>"; echo "telop_text4="; echo $telop_text4; ?> </body> </html> (結果)------------------------- telop_text1=見 telop_text2= telop_text3=タ telop_text4=一

    • ベストアンサー
    • PHP
  • メールフォームが部分的に文字化けする

    お問い合わせメールフォームを作りました。 一部のお客様からのメールが部分的に文字化けします。 ========== E月E6日に宿泊させてぁEだきました� そE際E対応でどぁEても納得できなかった為メールしました� ========== メールフォーム自体は UTF-8 でエンコードしていて、メール送信の際に JIS にしています。 ========== <?php mb_language("Japanese"); mb_internal_encoding("utf-8"); [snip] $from_name = mb_convert_encoding($from_name, "JIS", "UTF-8"); $from_name = '=?ISO-2022-JP?B?'.base64_encode($from_name).'?='; $body = mb_convert_encoding($body, "JIS", "UTF-8"); [snip] $mail_true = @mb_send_mail($mailto, $subject, $body, $additional_headers); [snip]

    • ベストアンサー
    • PHP
  • 機種依存文字

    いつもお世話になっております。 機種依存文字について質問させていただきます。 CSVファイルをアップロードして、文字コードがEUCのデータベースに 格納したいと思っております。(PHPの文字コードもEUCになっております。) 「(はしごたか)」「(たつさき)」などの機種依存文字が 文字化けをしてしまいます。 $name = mb_convert_kana(mb_convert_encoding($data[1], "EUC-JP", "Shift-JIS"), "KV") $name = mb_convert_kana(mb_convert_encoding($data[1], "eucJP-win", "Shift-JIS"), "KV") としても文字化けをしてしまいます。 また、以下の設定をしても文字化けは解消されません。 ini_set('default_charset', 'eucJP-win'); ini_set('mbstring.http_output', 'eucJP-win'); ini_set('mbstring.internal_encoding', 'eucJP-win'); 皆様、ご提示お願いいたします。 よろしくお願いいたします。 <環境> OS:Red Hat Linux PHP:Version 4.3.1 DB:MySQL 3.23.56

    • ベストアンサー
    • PHP
  • メールの内容が文字化けします・・・

    <? function sendmail($to,$from,$from_name,$title,$message){ /* EUCコードへのエンコーディング */ $to = mb_convert_encoding($to , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); $from = mb_convert_encoding($from , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); $title = mb_convert_encoding($title , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); $message = mb_convert_encoding($message , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); /* 改行コード変換(CR+LFへ変換) */ $to = ereg_replace("\r", "", $to); $to = ereg_replace("\n", "\r\n", $to); $from = ereg_replace("\r", "", $from); $from = ereg_replace("\n", "\r\n", $from); $from_name = ereg_replace("\r", "", $from_name); $from_name = ereg_replace("\n", "\r\n", $from_name); $title = ereg_replace("\r", "", $title); $title = ereg_replace("\n", "\r\n", $title); $message = ereg_replace("\r", "", $message); $message = ereg_replace("\n", "\r\n", $message); /* メールヘッダ生成 */ $header = "From: ".$from_name." <".$from.">\n"; $header .= "Reply-To: ".$from_name." <".$from.">\n"; /* メール本文生成 */ $message = mb_convert_kana($message,"KV"); /* 送信メッセージ言語設定 */ mb_language("Japanese"); /* メール送信処理 */ $rcd = mb_send_mail($to,$title,$message,$header); return $rcd; } ?> 何が原因か分からないのです・・・。 教えていただければ嬉しいですm(__)m

    • ベストアンサー
    • PHP

専門家に質問してみよう