3 に答える
DOMDocument は漢字をコードに変換するようです [...]。中国語やその他の外国語をコードに変換せずにそのまま保持するにはどうすればよいですか?
$dom = new DOMDocument();
$dom->loadHTML($html);
関数を使用しloadHTML
て HTML チャンクをロードしている場合。デフォルトでDOMDocument
は、その文字列は HTML のデフォルト エンコーディング ( ) であると想定されますがISO-8859-1
、ほとんどの場合、文字セット (sic!) は使用している文字列の横にあるメタ情報であり、内部ではありません。これをさらに複雑にするために、そのメタ情報は文字列内にさえある必要があります。
とにかく、HTML の文字列データを共有しておらず、エンコーディングを指定していないため、何が起こっているのかを具体的に伝えるのは困難です。
HTML は UTF-8 でエンコードされていると思いますが、これは HTML 文字列内で通知されません。したがって、次の回避策が役立ちます。
$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);
// dirty fix
foreach ($doc->childNodes as $item)
if ($item->nodeType == XML_PI_NODE)
$doc->removeChild($item); // remove hack
$doc->encoding = 'UTF-8'; // insert proper
エンコードのヒントが最初に挿入されます (HTML が読み込まれた後に削除されます)。その時点から、DOMDocument
(いつものように) UTF-8 を返します。
同様の問題の解決策を探しているときに、このスレッドに出くわしました。htmlを適切にロードし、Xpathなどで解析を行った後、テキストは次のようになります。
你的乱发
これはHTMLの本文では正常に表示されますが、スタイルまたはスクリプトタグ(中国語フォントの設定など)では正しく表示されません。
これを修正するには、lauthiamkokが行った逆の操作を行います。
$html = mb_convert_encoding($html, "UTF-8", "HTML-ENTITIES");
何らかの理由で最初の回避策が機能しない場合は、この変換を試してください。