2012-04-19 1 views
4

DOMDocument例えば、中国語やその他の外国語をそのままコードに変換するのではなく、そのまま使用する方法はありますか?

你的乱发は、彼らが代わりにコードに変換するのですと、私は中国や他の外国語を維持するにはどうすればよいä½ çš„ä¹±å‘

なり、コードに漢字を変換するようです?私はloadHTML()の前に、この下に追加する場合は以下

は、私の簡単なテスト、

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

ある

$html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8"); 

私が得る、

你的乱发 

さえしますcovertedコードはかかわらず、中国語の文字として表示される 你的乱发まだない 你的乱发何私は後になっています....

+4

これは「コードに変換する」ことではなく、「エンコードを破る」ことです。元のデータのエンコーディングとは何ですか?ファイルがUTF-8として保存されていますか? –

+0

文字はUTF-8ではなくASCIIで表示されます。 htmlファイルのheadセクションに がありますか? – BertR

+0

はいHTMLファイルのheadセクションにがあります。しかし、私はとにかくこの問題を回避することができました。ありがとう。 – laukok

答えて

8

DOMDocumentは漢字をコード[...]に変換するようです。中国語やその他の外国語をそのままコードに変換するのではなく、どうすればいいですか?

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

あなたはHTMLのチャンクを読み込むためにloadHTML機能を使用している場合。デフォルトではDOMDocumentは、その文字列がHTMLのデフォルトエンコーディング(ISO-8859-1)であると想定していますが、ほとんどの場合、文字セット(文字列)は、使用している文字列の横にメタ情報があります。これをより複雑にするために、そのメタ情報は文字列の中にあってもよい。

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を返します。同様の問題の解決策を検索するときに

+0

ありがとうございます。 – laukok

+1

また、よりHTMLに優しいかもしれない、 'で動作します。深い議論の詳細は、[PHPのDomDocumentがutf-8文字を扱うことができない(☆) "(http://stackoverflow.com/a/11310258/367456)の質問に対する同様の回答の中にあります。 – hakre

0

私はかなり確信しています。ä½ çš„ä¹±å‘は実際にはWindowsラテン語1(ASCIIではなく、ASCIIの発音区別符はありません)です。あなたのUTF-8テキストがWindows Latin 1として保存された途中で...

2

は、私はちょうどこのスレッドにつまずいた、私は正しくHTMLを読み込むとXPathなど...といくつかの解析を行った後、私のテキストは次のように終わる:

&#20320;&#30340;&#20081;&#21457; 

この表示はHTMLの本体には表示されますが、スタイルやスクリプトタグで適切に表示されません(たとえば、中国語フォントの設定など)。逆lauthiamkokを行い、これを修正するために

はなかった:

$html = mb_convert_encoding($html, "UTF-8", "HTML-ENTITIES"); 

最初の回避策はあなたのために動作しない何らかの理由で、この変換をしようとした場合。

関連する問題