Shift_JIS なのに丸数字が使われた XML を SimpleXML で読み込む

稀にある encoding="Shift_JIS" であるにも関わらず丸数字が使われている XML は、 SimpleXML で読むと次のようなエラーになり読むことが出来ません(DOM も libxml に基づくので同様です)。

simplexml_load_file(): ~~~ parser error : switching encoding: encoder error

encoding="Shift_JIS" の部分を encoding="Windows-31J" とかに置換すれば読めますが、 事前にエンコーディングがわかっているなら mbstring の HTML-ENTITIES を使って次のように読むことが出来ます。

<?php
// XML ファイルの読み込み
$data = file_get_contents(__DIR__ . '/xxx.xml');

// マルチバイト文字をHTMLエンティティに変換
$data = mb_convert_encoding($data, 'HTML-ENTITIES', 'SJIS-win');

// SimpleXML で文字列から読み込み
$xml = simplexml_load_string($data);

元ネタは php-users ML の これ です。どちらかというと XML よりも DOMDocument::loadHTML() で HTML を読むときのエンコーディング判別が上手くいかないときに使えるかもしれません。