我遇到類似this question一個問題:PHP的DOMDocument的nodeValue轉儲字面UTF-8字符,而不是編碼
nodeValue from DomDocument returning weird characters in PHP
的根本原因,我發現可以用mb_convert_encoding()
被模仿在我的單元測試,這終於抓住了問題:
$test = mb_convert_encoding('é', "UTF-8");
$this->assertTrue(mb_check_encoding($test,'UTF-8'),'data is UTF-8');
$this->assertTrue($this->rw->checkEncoding($test,'UTF-8'),'data is UTF-8');
$this->assertIdentical($test,html_entity_decode('é',ENT_QUOTES,'UTF-8'),'values match');
出現的UTF-8數據的原始值即將到來,並且運行PHP的系統的基本代碼頁很可能不是UTF-8。
一直到解析(使用轉儲到DOMDocument的HTML5lib實現),字符串保持乾淨,UTF-8友好。只有使用
$span->nodeValue
提取數據的點我會看到在編碼穩定性失敗。
我的猜測是,出口到nodeValue的domdocument的htmlentities使用編碼轉換器,但忽略了內聯編碼值。
鑑於我的問題是HTML5,我認爲它會直接關係到實施的新穎性,但它似乎是一個更廣泛的問題。除了開頭提到的問題之外,我一直無法通過搜索找到關於DOMDocument特定問題的任何信息。
UPDATE
在前進的名字,我從HTML5lib和DOM文檔到Simple HTML DOM切換,並導出乾淨轉義的HTML,我可以再解析回到正確的UTF-8的實體。
此外,一個功能我沒有嘗試是
utf8_decode
所以這可能是任何人都遇到此問題的解決方案。它解決了相關的問題,我用AJAX/PHP,解決方案在這篇博客中發現從2009年經歷:Overcoming AJaX UTF-8 Encoding Limitation (in PHP)
歡迎來到SO!一些其他問題。 「原始價值」是什麼意思,你能舉一些例子嗎?你的腳本文件中包含'é'的編碼是什麼?你能展示正確的,失敗的價值嗎?你在頁面上使用了什麼輸出編碼? – 2011-03-03 20:34:01
通過「原始值」我的意思是,最終使這個數值就是這個函數調用 'html_entity_decode的結果(「&Atilde; ©」,ENT_QUOTES,「UTF-8」)' 所以,基本上在HTML源有是一個跨度,包含帶字符é的單詞,當我使用'$ span-> nodeValue'提取該跨度的內容時,其中'$ span'是DOMDocument'getElementsByTagName()'的結果。 我試圖使用UTF-8隨處可見,元設置爲UTF-8,按照這個網站: '<!DOCTYPE HTML>
' – 2011-03-03 22:03:47因此,html頁面顯示'é','nodeValue'的結果是'&Atilde的等效物; '從我讀過的內容來看,相當於在沒有UTF-8的缺省編碼的系統上運行'mb_check_encoding('é','UTF-8')'時發生的情況 – 2011-03-03 22:18:50