人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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の時と同じ文字列で表示をしたいのです。

●質問者: kbkb
●カテゴリ:ウェブ制作
✍キーワード:GT HTML LT PHP print
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● Galapagos
●27ポイント

ご質問のソースで変換されるはずですが、ソースを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;
?>
◎質問者からの返答

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

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

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


2 ● y-kawaz
●27ポイント

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

&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 といった感じに実行してみたらどうなるか確認してみてはいかがでしょうか?

◎質問者からの返答

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

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

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

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


3 ● bayan
●26ポイント

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



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

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

print htmlspecialchars($str); 
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ