DOMDocument::loadHTML()
期望一個HTML字符串。
HTML使用ISO-8859-1
編碼(ISO拉丁字母編號1)作爲默認規格。這是因爲更長,請參閱6.1. The HTML Document Character Set。實際上,這更多的是在普通網頁瀏覽器中對Windows-1252
的默認支持。
因爲PHP的DOMDocument基於libxml並且帶有專爲HTML 4.0設計的HTMLparser,所以我回頭指出了這一點。
我想說假設你可以加載一個ISO-8859-1
編碼的字符串是安全的。
您的字符串是UTF-8
編碼的。把所有高於127/h7F的字符變成HTML Entities,你就沒事了。如果你不想這樣做你自己,那是什麼mb_convert_encoding
與HTML-ENTITIES
目標編碼的作用:
- 已命名實體的人物,會得到一個名爲entitiy。
€ -> €
- 其他人獲得他們的數字(十進制)實體,例如,
☆ -> ☆
下面是一個代碼示例,使進步多一點可見用回調函數:
$html = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function($match) {
list($utf8) = $match;
$entity = mb_convert_encoding($utf8, 'HTML-ENTITIES', 'UTF-8');
printf("%s -> %s\n", $utf8, $entity);
return $entity;
}, $html);
爲您的字符串此示範輸出:
☆ -> ☆
☆ -> ☆
☆ -> ☆
無論如何,這只是爲了更深入地觀察你的字符串。你想要它可以轉換成編碼loadHTML
可以處理。這可以通過US-ASCII
所有外轉換成HTML實體來完成:
$us_ascii = mb_convert_encoding($utf_8, 'HTML-ENTITIES', 'UTF-8');
要小心,你的投入實際上是UTF-8編碼。如果您甚至有混合編碼(可能會發生一些輸入),mb_convert_encoding
只能處理每個字符串的一種編碼。我已經在上面概述瞭如何在正則表達式的幫助下更具體地進行字符串替換,所以我現在留下更多細節。
另一種選擇是提示的編碼。這可以在你的情況下,通過修改文件並添加
<meta http-equiv="content-type" content="text/html; charset=utf-8">
這是一個Content-Type的指定字符集來完成。對於不能通過網絡服務器訪問的HTML字符串(例如,保存在磁盤上或在您的示例中保存在字符串中),這也是最佳做法。 Web服務器通常設置爲響應頭。
如果你不小心放錯位置的警告,你可以將其添加在前面的字符串:
$dom = new DomDocument();
$dom->loadHTML('<meta http-equiv="content-type" content="text/html; charset=utf-8">'.$html);
%的HTML 2.0規範,元素只能出現在文檔的<head>
節,會自動放置在那裏。這也是發生在這裏的事情。輸出(漂亮地打印):
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta charset="utf-8">
<title>Test!</title>
</head>
<body>
<h1>☆ Hello ☆ World ☆</h1>
</body>
</html>
感謝養育問題,類似的一個是:如何保持中國或其他外國語言,因爲它們將它們轉換爲代碼而不是?](HTTP://計算器.com/q/10237238/367456)但是你可能會認爲這是一種黑客行爲。 – hakre
相關:[PHP請求#47875 - 無法設置HTML輸入編碼](https://bugs.php.net/bug.php?id=47875) – hakre
奇怪的是:php文檔說: DOM擴展使用UTF-8編碼。使用utf8_encode()和utf8_decode()來處理ISO-8859-1編碼中的文本或其他編碼中的Iconv。' 請參閱:http://www.php.net/manual/en/intro.dom.php – jens