• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DOMNodeのtextContentで日本語が正しく取得できません。)

日本語が正しく取得できない問題について

このQ&Aのポイント
  • DOMNodeのtextContentで日本語が正しく取得できない問題があります。
  • PHP 5.2.11の環境でDOMCommentのDOMElementのtextContentを使って日本語を取得しても、正しく取得できない現象が起きます。
  • DOM関数がマルチバイトに対応していない可能性があります。文字コード変換関数を試しても解決しないようです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

前置き: 白状すると、俺、rawurldecodeとrawurlencodeを見間違えて、「作り方おかしいぜ」ってなコメント入れようとしていたんだ。 #まぁrawurldecodeだったとしても納得いかないんだけど(ソースとコメント参照)。 #しかも str_replace ("euc-jp","utf-8",$data);って"euc-jp"がmeta[@http-equiv="ContentType"]以外にあったらどーすんだ、と。 人のミスを見つけると子供のように喜ぶ俺は うきうき気分で自己紹介欄にコメント書いて、さあ後は実験だ、となった。(間違った予測) …あれれ、失敗。失敗。失敗。自分も出来ない(泣) え?え?え?loadHTMLはmeta要素で指定されていれば、文字符号化方式は自動的に判別するはずだしなぁ (しばらく検索) …PHPのばっかやろー。 ================== 本題: http://devzone.zend.com/article/8855 If encoding is not declared in the XML/HTML header, the input string is parsed as 符号化方式がXMLおよびXHTMLのヘッダで示されていないとき(訳注:meta要素も含むと思う)、 入力文字列は以下の物として解釈される * a UTF-8 string by loadXML(); loadXML()を使った時はUTF-8の文字列 * an ISO-8859-1 string by loadHTML() (!!!!) corresponding to the HTTP 1.1 standard (RFC2068, section 3.7.1); * and DOMDocument::$encoding is set to null. loadHTML()を使った時は、HTTP1.1に基づき、ISO-8859-1の文字列として解釈する。 このとき、DOMDocument::$encodingはnullに設定される。 Clearly, problems of correct document encoding transformation are more difficult to be solved for HTML parsing than XML, as the latter has a more formal specification and stricter rules, XML encoding is declared in the opening tag, and the default encoding is UTF-8, which covers the whole Unicode range. So the rest of the article will mostly touch on HTML parsing problems. 明らかに、正しい符号化方式変換の問題はXMLのパースよりHTMLのパースの方が解決するのが難しい。何故なら後者はよりもっと詳しい仕様書と厳格なルールがあるからだ。XMLの符号化方式は始まりのタグ(訳注:XML宣言のこと?)で宣言される。されなかったときのデフォルトはUnicodeの範囲全体をカバーするUTF-8がデフォルトだ。 よって、この記事の残りの殆どはHTMLのパースの問題について述べている。 Encoding issues with HTML parsing HTMLのパースの符号化方式の問題 Unfortunately, loadHTML() doesn't always correctly recognize the defined Content-type HTTP-EQUIV meta tag. 【残念ながらloadHTML()はいつも正しくmeta[@http-equiv="Content-Type"]を認識するわけではない】 The following things act as blockers: 以下の時は認識を阻むものとして動く。 * Any non-ASCII symbol occurring before the Content-type HTTP-EQUIV meta tag; 【ASCII外の文字が何かmeta[@http-equiv="Content-Type"]の前に登場すること】 * Any invalid (from an encoding point of view) symbol occurring in the document. E.g. Content-type meta tag declares 'charset=UTF-8', but the actual HTML markup contains non-valid UTF-8 sequences. ===================== …え?まさか確かめてみる。 loadHTMLが実行出来ない以上、DOMノードが作れないので CDATAマーク区間その他に含まれる同じ文字列を巻き込むこと覚悟で "<!--龠龠龠-->"をstr_replaceで置き換えてみた →成功orz ============== #っていうか、他の部分を巻き込まず、"サニタイズ"を考えなくていいところがDOMの一つの利点だと思うんだがな…

この投稿のマルチメディアは削除されているためご覧いただけません。
yyr446
質問者

お礼

ご解答ありがとうございます。 3日間ほど、寝込んでいたもので、今読みました。 研究してみます。

yyr446
質問者

補足

ご回答をヒントに解決できました。 ブラウザー文字化け対策の記述が仇となってたみたいです。 <!--龠龠龠-->を<--binyu--> として無事解決しました。龠は美乳の一種だったとは。

関連するQ&A