PHPで文字コード変換時にHTMLタグが変換されない方法を教えて下さい。

調査時間が不足しているため質問いたします。

$str = "&lt;学校&gt;<span style=\"color:#FF0000;\">URL</span>"; //utf-8
$str = mb_convert_encoding($str, "sjis", "utf-8");
print $str; // <学校><span style=\"color:#FF0000;\">URL</span>になる

shift_jisでprintした際にutf-8の時と同じ文字列で表示をしたいのです。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/10/20 19:52:19
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:Galapagos No.1

回答回数963ベストアンサー獲得回数89

ポイント27pt

ご質問のソースで変換されるはずですが、ソースをUTF-8で保存していますか?

ご確認ください。

念のため、mb_internal_encodingを加えたものを下記にしまします。

<?php
mb_internal_encoding('UTF-8');
$str = "&lt;学校&gt;<span style=\"color:#FF0000;\">URL</span>"; //utf-8
$str = mb_convert_encoding($str, 'SJIS', 'UTF-8');
print $str;
?>
id:kbkb

ソースはShift_JISです。目的としているのは”変換されない”ことです

×<学校><span...</p>

○&lt;学校&gt;<span...</p>

2010/10/20 09:44:51
id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント27pt

そのコードでそのような変換がされるとは思えないのですが…。こちらでも実際に試してみましたが出力された文字列は以下の通りでした。

&lt;学校&gt;<span style=\"color:#FF0000;\">URL</span>

僕は質問者さんが何か変な環境でファイルを作っていて &lt; で入力したつもりが実は < で保存されている可能性を疑ってるのですが、それは無いと仮定すると何か環境依存の問題があるのでしょう。

いくつか可能性がありそうなところを検討してみましたが、思い当たる節は今のところありません。

・mb_convert_encoding で指定できるエンコーディングには特殊なものとして "BASE64" とか "HTML-ENTITIES" とかあるのでそれらの何かが "sjis" のエイリアスとして設定されていると仮定するとこの現象が起こりうるのか?と思いましたが、僕の調べた範囲では指定できるエンコーディングにはHTMLエスケープするものはあっても逆は無さそうでした(fromのutf-8を指定している側にHTML-ENTITIESを指定したらエスケープになるんですがその場合「学校」の部分が文字化けしてしまうようですし…)

・phpでは &lt; を出力しているが、Apache側でそれを < に変換するようなフィルタが設定されている?ただそんなフィルタは標準では無く自分で作らないとありえないし、そもそもセキュリティ的にも考えにくいのでこれも無いか…


とりあえずブラウザ確認ではなく、サーバ上で手で php test.php といった感じに実行してみたらどうなるか確認してみてはいかがでしょうか?

id:kbkb

すいません別の原因であることがわかりました。

mb_ereg_replaceで&lt;が"<"(半角)に変換されてしまうのではなく、

元々<(全角)だったものがその後のmb_convert_kana($str, 'ka', 'sjis');によって半角"<"に変換されてしまったことによるものでした。

元々<(全角)だったことに気づかなかったのはAPIからutf-8文字コードで取得したデータを変数に格納していたためです。。

※Shift_JISコード

$str = "<学校>URL"; //実際にはutf-8

$str = mb_convert_encoding($str, "sjis", "utf-8");

$str = mb_ereg_replace("<", "&lt;", $str);

$str = mb_ereg_replace(">", "&gt;", $str);

$str = mb_convert_kana($str, 'ka', 'sjis');

print $str; // &lt;学校&gt;URL

と想定通り表示することができるようになりました。

色々とありがとうございました。

2010/10/20 19:51:49
id:bayan No.3

回答回数100ベストアンサー獲得回数13

ポイント26pt

文字コードの変換をせずUTF-8のままだと期待通り表示されるということでしょうか?



&gt; を &lt; を見たまんま表示したいとことでしたら

htmlspecialchars にかけてはどうでしょうか?

print htmlspecialchars($str); 
  • id:rouge_2008
    次の文字列が表示されればいいのですか?

    <学校><span style=\"color:#FF0000;\">URL</span>


    ブラウザに表示した場合、HTMLタグはブラウザによって解釈されるので、上記のようには表示されませんが、HTMLタグが変換されているわけではありません。
    今のままでも元の文字列とほぼ同じはずです。
    ブラウザでHTMLソースを表示して確認してみてください。
  • id:rouge_2008
    mb_convert_encoding()でHTMLタグが変換されるという事はありません。
    上でもコメントしましたが、ブラウザでHTMLソースを確認してみてください。
    ご存知だと思いますが、「&lt;」が「<」、「&gt;」が「>」で表示されるのもブラウザで表示しているからです。
    文字コード変換前の文字列をブラウザ表示して確認してみてください。
  • id:Galapagos
    ソースがSJISなのでしたら
    $str = "&lt;学校&gt;<span style=\"color:#FF0000;\">URL</span>"; //utf-8
    もSJISになってしまい、
    $str = mb_convert_encoding($str, "sjis", "utf-8");
    の動作がおかしなことになってしまいますよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません