簡體   English   中英

編碼DOMDocument php的錯誤字符

[英]wrong characters encoding DOMDocument php

我有一些html內容,其所有文本均為波斯語! 我想通過方法DOMDocument :: loadHTML($ html)將此內容提供給DOMDocument來做一些事情,然后由DOMDocument :: saveHTML()交還給它...但是在顯示字符時存在問題:-(例如即使將我的腳本文件編碼更改為UTF-8,“سلام”也更改為“سلام”,但它不起作用。

<?php
$html = "<html><meta charset='utf-8' /> سلام</html>";

$doc = new DOMDocument('1.0', 'utf-8');
$doc->loadHTML($html);
print $html; // output : سلام
print $doc->saveHTML(); // output : سلام
print $doc->saveHTML($doc->documentElement); // output : سÙاÙ
?>

更新:根據朋友的指示,我使用$ doc-> loadHTML(mb_convert_encoding($ html,'HTML-ENTITIES','UTF-8')); 而且有效!

告訴XML解析器所讀取的數據是UTF-8編碼的:

<?php

// original input (unknown encoding)
$html = '<html>سلام</html>';

$doc = new DOMDocument();

// specify the input encoding
$doc->loadHTML('<?xml encoding="utf-8"?>' . $html);

// specify the output encoding
$doc->encoding = 'utf-8';

// output: <html><body><p>سلام</p></body></html>
print $doc->saveHTML($doc->documentElement);
$html = '<html>سلام</html>';
$doc = new DOMDocument();

使用2個libxml預定義常量( LIBXML_HTML_NOIMPLIEDLIBXML_HTML_NODEFDTD )將字符串$html的字符編碼轉換為UTF-8,然后將其加載到DOM。

第一個設置HTML_PARSE_NOIMPLIED flag ,它關閉了隱式html / body ...元素的自動添加(僅從PHP 5.4.0起才可用)。

第二個設置HTML_PARSE_NODEFDTD標志,該標志防止在找不到一個默認文檔類型時添加默認文檔類型。 使用這些常量可以幫助您以更靈活的方式管理解析。

$doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

然后,定義DOM編碼本身(先前的定義用於輸入):

$doc->encoding = 'UTF-8';

如果不使用libxml 2.7.7(從PHP> = 5.4.0開始),請刪除前導和尾隨的<html><body>標記:

$doc->normalizeDocument(); //Remove leading and trailing <html> & <body> tags
print $doc->saveHTML($doc->documentElement);

玩得開心!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM