調査時間が不足しているため質問いたします。
$str = "<学校><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の時と同じ文字列で表示をしたいのです。
ご質問のソースで変換されるはずですが、ソースをUTF-8で保存していますか?
ご確認ください。
念のため、mb_internal_encodingを加えたものを下記にしまします。
<?php mb_internal_encoding('UTF-8'); $str = "<学校><span style=\"color:#FF0000;\">URL</span>"; //utf-8 $str = mb_convert_encoding($str, 'SJIS', 'UTF-8'); print $str; ?>
そのコードでそのような変換がされるとは思えないのですが…。こちらでも実際に試してみましたが出力された文字列は以下の通りでした。
<学校><span style=\"color:#FF0000;\">URL</span>
僕は質問者さんが何か変な環境でファイルを作っていて < で入力したつもりが実は < で保存されている可能性を疑ってるのですが、それは無いと仮定すると何か環境依存の問題があるのでしょう。
いくつか可能性がありそうなところを検討してみましたが、思い当たる節は今のところありません。
・mb_convert_encoding で指定できるエンコーディングには特殊なものとして "BASE64" とか "HTML-ENTITIES" とかあるのでそれらの何かが "sjis" のエイリアスとして設定されていると仮定するとこの現象が起こりうるのか?と思いましたが、僕の調べた範囲では指定できるエンコーディングにはHTMLエスケープするものはあっても逆は無さそうでした(fromのutf-8を指定している側にHTML-ENTITIESを指定したらエスケープになるんですがその場合「学校」の部分が文字化けしてしまうようですし…)
・phpでは < を出力しているが、Apache側でそれを < に変換するようなフィルタが設定されている?ただそんなフィルタは標準では無く自分で作らないとありえないし、そもそもセキュリティ的にも考えにくいのでこれも無いか…
とりあえずブラウザ確認ではなく、サーバ上で手で php test.php といった感じに実行してみたらどうなるか確認してみてはいかがでしょうか?
すいません別の原因であることがわかりました。
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
と想定通り表示することができるようになりました。
色々とありがとうございました。
文字コードの変換をせずUTF-8のままだと期待通り表示されるということでしょうか?
> を < を見たまんま表示したいとことでしたら
htmlspecialchars にかけてはどうでしょうか?
print htmlspecialchars($str);
ソースはShift_JISです。目的としているのは”変換されない”ことです
×<学校><span...</p>
○&lt;学校&gt;<span...</p>