
HTML文字列を処理するためにmb_convert_encoding($contents, 'HTML-ENTITIES', 'UTF-8')
と書いたらDeprecatedエラー。解決方法メモ。
結論:PHP 8.2以降の対応コード
$contents = "テスト & テキスト";
$converted = mb_encode_numericentity($contents, [0x80, 0xffff, 0, 0xffff], 'UTF-8');
echo $converted;
// 出力: テスト & テキスト
解説
mb_encode_numericentity()の構文
mb_encode_numericentity(string $string, array $convmap, string $encoding): string
- 第一引数: 変換対象の文字列。
- 第二引数: 数値エンティティ化するUnicode範囲を指定する配列(
convmap
) - 第三引数: 入力文字列のエンコーディング(例:
'UTF-8'
)
convmapの設定
convmap
は、変換する文字範囲を指定。
$convmap = [start_code, end_code, offset, mask];
start_code
: 変換対象の開始Unicodeコードポイント。end_code
: 変換対象の終了Unicodeコードポイント。offset
: 数値エンティティの基準(通常は0
)mask
: マスク値(通常は0xffff
)
例:
$convmap = [0x80, 0xffff, 0, 0xffff]; // Unicode範囲: U+0080~U+FFFF
上記コードでは、文字列中のUnicodeコードポイントが0x80
から0xffff
に該当する場合、それらが数値エンティティ(例: &
)に変換される。
DOMDocumentと組み合わせる場合
HTML文字列を処理するためにDOMDocument::loadHTML()
を使用している場合にも利用可。
非推奨コード:
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($contents, 'HTML-ENTITIES', 'UTF-8'));
推奨コード:
$dom = new DOMDocument();
$encodedContents = mb_encode_numericentity($contents, [0x80, 0xffff, 0, 0xffff], 'UTF-8');
$dom->loadHTML($encodedContents);
アクセシビリティと互換性
- ブラウザ互換性:
- 数値エンティティ(例:
&
)はすべてのブラウザでサポート。
- 数値エンティティ(例:
- パフォーマンス:
mb_encode_numericentity()
は軽量で高速。- 非推奨機能を回避することで将来の互換性も確保できる。
- 安全性:
- 必要な範囲だけ数値エンティティ化できるため不要な変換を防げる。
まとめ
PHP 8.2以降では、以下のように置き換えることで非推奨メッセージを回避しつつ、同等の機能を実現できる。
- 使用していた
mb_convert_encoding()
をmb_encode_numericentity()
に変更。 - 適切な変換マップ(
convmap
)を設定。 - 必要に応じてエンコーディングや文字範囲を調整。
参考リンク

PHP: mb_encode_numericentity - Manual
PHP is a popular general-purpose scripting language that powers everyt...

PHP 8.2でmb_convert_encoding()が非推奨。回避方法は?
PHP8に移行して、mb_convert_encoding関数が非推奨というメッセージを目にしました。非推奨 mb_convert_enco...

PHP8.2で非推奨になったエンコーディングたち - Qiita
この記事は PHP Advent Calendar 2022 13日目の記事です。つい先日、PHP8.2がリリースされました 毎回メジャーリ...

【php】HTML-ENTITIESの文字化けが気になる

PHP 8.4の新しいDOM APIはいいぞ! - Qiita
ジョブカン事業部のアドベントカレンダー 8日目です。はじめに年末といえば、PHPの新しいバージョンがリ…
コードの利用は自己責任でお願いいたします。
本記事の一部はAIによって生成されました。AIが生成した部分については、著者が内容を確認し必要に応じて修正を加えています。
コメント欄