2012-09-10 64 views
3

我正在使用PHP簡單HTML DOM解析器http://simplehtmldom.sourceforge.net/從其他域中獲取像頁面標題,元描述和元標記之類的數據,然後將其插入到數據庫中。PHP簡單HTML DOM解析器的字符編碼問題

但我有一些編碼問題。問題是我沒有從那些不是英語的網站上得到正確的字符。

下面是代碼:

<?php 
require 'init.php'; 

$curl = new curl(); 
$html = new simple_html_dom(); 

$page = $_GET['page']; 

$curl_output = $curl->getPage($page); 

$html->load($curl_output['content']); 
$meta_title = $html->find('title', 0)->innertext; 

print $meta_title . "<hr />"; 

// print $html->plaintext . "<hr />"; 
?> 

輸出爲facebook.com

Welcome to Facebook â€」 Log in, sign up or learn more

輸出爲amazon.cn

亚马逊-网上购物商城:è¦ç½‘è´­, å°±æ¥Z.cn!

mail.ru

Mail.Ru: почта, поиÑк в интернете, новоÑти, игры, развлечениÑ

所以輸出的字符沒有被正確編碼。

任何人都可以幫助我如何解決這個問題,以便我可以將正確的數據添加到我的數據庫。

+0

如果您將瀏覽器中的編碼切換到其他視圖>編碼下,會發生什麼? – deceze

+0

如果我將瀏覽器編碼切換爲UTF-8,則可以使用。 – Prakash

+0

請參閱http://stackoverflow.com/questions/4550903/simple-html-dom-character-encoding-issue –

回答

10

@deceze and @Shakti謝謝你的幫助。

+1發表deceze(Handling Unicode Front to Back in a Web App)的文章鏈接,也值得一讀Understanding encoding

閱讀您的意見,答案當然那兩篇文章後,我終於解決了我的問題。

我列出我做了迄今爲止的措施來解決這個問題:

  1. 添加header('Content-Type: text/html; charset=utf-8');我的init.php文件的頂部,我的數據庫表字段的
  2. 更改CHARACTER SET其存儲這些值轉換爲UTF-8,
  3. 設置MySQL連接字符集爲UTF-8 mysql_set_charset('utf8', $connection_link_id);
  4. 使用ヶ輛()函數轉換成字符$meta_title = htmlentities(trim($meta_title_raw), ENT_QUOTES, 'UTF-8');

現在的問題似乎解決了,但我仍然需要做以下事情來解決這個問題在全。

  1. 從源$source_charset獲取編碼字符集。
  2. 如果字符串已經不在相同的編碼中,則將字符串的編碼更改爲UTF-8。爲此,唯一可用的PHP函數是iconv()。例如:iconv($source_charset, "UTF-8", $meta_title_raw);

爲了得到$source_charset我可能不得不使用一些技巧還是多檢查。像檢查標題和元標記等,我發現一個很好的答案在Detect encoding

讓我知道是否有任何改善或任何錯誤在我上面的步驟。

3

如果我將瀏覽器編碼切換爲UTF-8,它將起作用。

所以你根本就沒有設置正確的HTTP頭來指定你的文檔是UTF-8編碼,而瀏覽器正在用其他編碼解釋它。使用:

header('Content-Type: text/html; charset=utf-8'); 
+0

上面列出的PHP代碼僅用於測試哪些作品添加內容類型標題。我的真實代碼會將info($ meta_title'的值)添加到數據庫中,然後另一個頁面將從數據庫中檢索這些值,但是在該頁面,即使設置爲UTF-8,它也不工作。 – Prakash

+0

@Prakash:您必須確保將數據庫當前連接設置爲接受「utf-8」數據。在向數據庫發送任何查詢之前運行此查詢「SET NAMES UTF-8」,並確保您的數據庫,表,列設置爲utf-8編碼。然後在另一個頁面中設置UTF-8標題應該可以工作。 –

+1

@Prakash然後我建議你閱讀[在Web應用程序中處理Unicode前後](http://kunststube.net/frontback/) – deceze

0

我有與羅馬尼亞字符相同的問題。直到我用

header('Content-Type: text/html; charset=ISO-8859-2'); 

ISO-8859-2是東歐字母的字符集。所以找到適合你的語言的正確字符集並在標題中使用它。