2011-03-03 41 views
4

我遇到類似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)

+0

歡迎來到SO!一些其他問題。 「原始價值」是什麼意思,你能舉一些例子嗎?你的腳本文件中包含'é'的編碼是什麼?你能展示正確的,失敗的價值嗎?你在頁面上使用了什麼輸出編碼? – 2011-03-03 20:34:01

+0

通過「原始值」我的意思是,最終使這個數值就是這個函數調用 '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

+0

因此,html頁面顯示'é','nodeValue'的結果是'&Atilde的等效物; '從我讀過的內容來看,相當於在沒有UTF-8的缺省編碼的系統上運行'mb_check_encoding('é','UTF-8')'時發生的情況 – 2011-03-03 22:18:50

回答

2

只是用utf8_decode上的nodeValue它確實有點兒工作,必須有特殊字符顯示不正確的問題。

然而,某些字符仍然存在問題,如簡單的報價「和其他幾個人(OE例如)

因此,使用$元素 - >的nodeValue將無法正常工作,但utf8_decode($元素 - >的nodeValue )將 - 部分。

+0

Ah yes,in這個案例我使用的是法語口音,所以這成爲一個主要問題,所有「標準」字母實體都很好,但任何冒險進入UTF-8的領域都會被錯誤地轉換。我想知道是否有服務器設置涉及到某個地方? – 2012-10-29 15:24:16

1

函數utf8_decodeutf8_encode的名字不是很好。他們直接從utf-8轉換爲iso-8859-1iso-8859-1分別轉換爲utf-8

mb_convert_encoding當僅用utf-8調用時,參數通常與使用函數utf8_encode相似。(通常情況下,除非你改變了內部代碼頁,你可能 - 希望 - 沒有)。

大部分PHP的函數預期字符串爲iso-8859-1編碼。然而,libxml(這是PHP的XML解析庫的基礎庫)期望字符串爲utf-8。因此,如果你不謹慎,你可以很容易地結束編碼。

至於你的測試,第一行可能是騙人的。由於腳本中的文字爲é,因此測試會根據您保存文件的編碼而發生變化。請檢查文本編輯器。

希望澄清一下。

+0

當我正在處理這些問題時,我學到了很多有關這些函數的功能的東西:)我沒有更改內部代碼頁(看到了有關此問題的警告)。另外值得注意的是,您在問題中看到的測試代碼是大概是第五個排列。我嘗試了幾種不同的方式來保存文件(確保UTF-8,windows native)並觸發該字符(hex,ascii,html實體),我發佈的是最後一次嘗試。使我想再次測試該代碼!感謝您的想法。 – 2012-06-04 15:48:40

相關問題