環境
- php7.2
- php5.3からの移行作業中
事象
以下のメッセージがerror_logに吐かれてた。
PHP Strict Standards: htmlentities(): Only basic entities substitution is supported for multi-byte encodings other than UTF-8; functionality is equivalent to htmlspecialchars in ファイルパス on line 行番号
該当箇所のPHPソースは以下の感じ。
htmlentities(文字列,1,'euc-jp')
Google翻訳かけると以下だった。
PHPの厳格な標準:htmlentities():UTF-8以外のマルチバイトエンコーディングでは、基本的なエンティティの置換のみがサポートされています。 機能は、行番号行目のファイルパスにあるhtmlspecialcharsと同等です。
原因
htmlentities()関数をUTF-8以外の文字コードでマルチバイトエンコーディングしようとしてるので、HTML エンティティに変換できない文字列があるよ、と教えてくれている。
んで、それは(htmlentities関数の動きは)htmlspecialchars() 関数を使ったときと同じ動きになりますよ、と。
本来は、
htmlspecialchars() より、
htmlentities() の方が、多くの文字列をHTML エンティティに変換できる。(以下を参考)
参考1:
入力文字列の中で名前付きエンティティに関連づけられたものを すべて変換する必要がある場合には、代わりに htmlentities() を使用してください
参考:https://www.php.net/manual/ja/function.htmlspecialchars.php
参考2:
htmlspecialchars()で変換対象となる文字は以下になります。
- 「& (アンパサンド)」
- 「” (ダブルクォート) 」(※オプションによる)
- 「’ (シングルクォート)」(※オプションによる)
- 「< (小なり)」
- 「> (大なり) 」
HTMLタグなどコードの一部として機能するものが変換対象となっています。
一方、htmlentities()に関しては、エンティティ変換可能なもの全てが変換対象となっています。
対処方法
以下いずれかだなー。
- 放置する
- default_charsetをUTF-8にして、コンテンツ全部UTF-8化する。(現在はEUC-JP)
- PHP5 Strict Standards:を非表示にする
その他参考にしたサイト
htmlentities公式マニュアル
⇒現在では状況が変わったみたい(htmlspecialchars公式マニュアル:> 省略した場合の encoding
のデフォルト値は、 default_charset の値を使います。)ですが、参考になりました。
コメント