今日はPHPの出力関数についてです。
以前、携帯電話サイトの開発はロジックからHTML出力までShift_JISで統一して
作ることが多かったのですが、最近はロジックはUTF-8で作り、HTML出力は
Shift_JISで出力するパターンも出てきました。
すると、よくありがちなのが文字化けです。
UTF-8でデータを取得していざHTMLの表示で文字化けしてしまう。
Shift_JISで出力しなければいけないのに、HTML部分をUTF-8で保存したがために
出力すると文字化けしてしまう。
なので、ロジックはUTF-8で作って、ob_start関数とmb_output_handler関数を
使ってHTML出力部分をShift_JISコードに変換して出力します。
次のサンプルを作ります。
<?
// 適当に文章を設定
$str = "今年はバレンタインのチョコレートをたくさん食べました";
// 出力言語にテンプレートを変換
mb_http_output("Shift_JIS");
ob_start("mb_output_handler");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>バレンタインテスト</title>
</head>
<body>
<?= $str ?>
</body>
</html>
<? ob_end_flush(); ?>
このサンプルコードをあえて文字コードをUTF-8で保存します。
実行してみます。
文章が表示されました。
今年はバレンタインのチョコレートをたくさん食べました
ある場合とない場合の違いはブラウザが選択している文字コードです。
ない場合はUTF-8が選択されて表示されますが、上記のサンプルの場合は、
ブラウザのエンコードもShift_JISが選択されています。
ob_start関数は出力のバッファリングをオンにします。 その後は内部で出力内
容をためていきます。
mb_output_handler関数は出力バッファ内で文字エンコーディングをするコール
バック関数です。サンプルではShift_JISを指定することで、コードをUTF-8から
Shift_JISに変換しています。
ob_end_flush関数は出力バッファを送信した後に、出力のバッファリングをオフ
にする関数です。
ob_startで吸って、ob_end_flashで吐いておしまい!というイメージです。
もう1つ、HTML部分をある文字に置き換えて表示したい場合もあるかもしれません。
この場合は自分でコールバック関数を作って、オリジナルの処理をして出力する
こともできます。
<?php
function winter_game($buffer)
{
// バンクーバーを全てにソチ置換する
return (str_replace("Vancouver", "XXII", $buffer));
}
ob_start("winter_game");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<body>
Vancouver Olympic Winter Games<br />
Vancouver Olympic Winter Games<br />
Vancouver Olympic Winter Games<br />
Vancouver Olympic Winter Games<br />
Vancouver Olympic Winter Games<br />
</body>
</html>
<?php
ob_end_flush();
?>
これを実行すると・・・
XXII Olympic Winter Games
XXII Olympic Winter Games
XXII Olympic Winter Games
XXII Olympic Winter Games
XXII Olympic Winter Games
全部ソチになりましたね。
まだバンクーバーオリンピック開催中ですが、4年後に期待です。
今日はフィギィアスケート男子、高橋選手銅メダル取りましたね。
フィギィアスケート男子史上初のメダル。すばらしいです!
週末は寝不足になりそうです。
おしま~い。














コメントする