むかーし昔、ガラケー用サイトは文字コードがShift_JISで、通信量削減のためにカタカナは半角にするのが推奨でした。
出力前に共通処理で変換かけてたりしたなあと思い出しつつ、今CakePHPで同じことをやろうとするなら afterFilter で一括でやってしまいたいなあと思って調べたけれど、なかなか良い例がなかったので、サンプルを書いておきます。
public function afterFilter(EventInterface $event)
{
// 出力前の HTML<body> を $body へ
$this->getResponse()->getBody()->rewind();
$body = $this->getResponse()->getBody()->getContents();
// ここに変換する処理を書く
$body = mb_convert_kana($body, "sk"); // 半角化
$body = mb_convert_encoding($body, "SJIS-win"); // Shift_JIS化
// こんな感じで文字列を置き換えたりとかも
$body = str_replace('変換前', '変換後', $body);
// 出力
return $this->getResponse()->withStringBody($body);
}
User-Agentでガラケーかどうか判定して処理するとか、ヘッダーに文字コード指定を入れてあげたりとかも、ここでまとめてやって良いと思います。
このへんは他に例がいっぱいあるので省略。
ちなみにCakePHP3くらいまでは $this->output の中に出力内容が入っていたような覚えがあるけれど、4では書き方が変わっています。
公式ドキュメントでは getStringBody() という全文取れるようなメソッドが紹介されていますがなぜか存在せず。
getBody() で取り出せるのはStreamInterface型なので、出力するHTMLのサイズが巨大なときは、readメソッドで少しづつ読み込んで処理するのが使用メモリ量や処理速度の面では良いでしょう。
公式ドキュメント
https://book.cakephp.org/4/ja/core-libraries/httpclient.html#id12
作っていて思い出したのはガラケーのことなのですが、実際やりたかったことは「㈱」「㍍」などの機種依存文字を普通の文字列に置き換えること。
本来はDBやAPIから値を取り出すときに変換してあげるべきなのでしょうけれど、どこで使われているのかもはや追い切れないときはこのような方法に。
そして表示する文字数が変わってしまうと困るので、無理矢理文字を小さくして並べたりといったアクロバティックな変換も。
<span style='display:inline-block; font-size:50%; line-height:100%;'>メー<br/>トル</span>
<span style='display:inline-block; transform: scaleX(0.8); letter-spacing:-0.3ex;'>(株)</span>
いっそのことFont Awesomeの次のバージョンに機種依存文字が全部入ってくれたら楽なのになあ。