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
スポンサーリンク

 

環境

  • 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:

PHPのhtmlentities()とhtmlspecialchars()の違いと適切なエンティティ変換
特殊文字をHTML上に展開する場合、そのまま出力すると文字化けを起こしたりHTML構造が壊れたりしてしまう場合があるので、適宜エンティティ変換を行う事が推奨されます。PHPではエンティティ変換用にhtmlentities関数とhtmlspecialchars関数が用意されています。

htmlspecialchars()で変換対象となる文字は以下になります。

  • 「& (アンパサンド)」
  • 「” (ダブルクォート) 」(※オプションによる)
  • 「’ (シングルクォート)」(※オプションによる)
  • 「< (小なり)」
  • 「> (大なり) 」

HTMLタグなどコードの一部として機能するものが変換対象となっています。

一方、htmlentities()に関しては、エンティティ変換可能なもの全てが変換対象となっています。

 

 

対処方法

以下いずれかだなー。

 

その他参考にしたサイト

htmlentities公式マニュアル

 

PHP5.4のhtmlspecialcharsに非互換問題
PHP5.4.0から、htmlspecialchars関数のデフォルト文字エンコーディングがISO-8859-1(Latin-1)からUTF-8に変更されます。これに伴い、従来動いていたアプリケーションが動かなくなるケースが出てきます。典型的には、以下の両方の条件に該当するアプリ...

 ⇒現在では状況が変わったみたい(htmlspecialchars公式マニュアル:> 省略した場合の encoding のデフォルト値は、 default_charset の値を使います。)ですが、参考になりました。

 

 

 

 

 

 

 

コメント