簡體   English   中英

PHP DOMDocument loadHTML UTF-8正確編碼為HTML5 doctype

[英]PHP DOMDocument loadHTML UTF-8 encoding correctly with HTML5 doctype

我正在將HTML的DOMDocument類與HTML 5文檔一起使用。 但是當我這樣做時,某些utf-8字符被“更改”。   ’ é 等等....

這是我的代碼。

    $parsedUrl = 'http://www.futursparents.com/';

    $curl = curl_init();
    @curl_setopt_array($curl, [
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_TIMEOUT => 60,
            CURLOPT_CONNECTTIMEOUT => 30,
            CURLOPT_FOLLOWLOCATION => TRUE,
            CURLOPT_MAXREDIRS => 5,
            CURLOPT_AUTOREFERER => FALSE,
            CURLOPT_HEADER => TRUE, // FALSE
            CURLOPT_PROTOCOLS => CURLPROTO_HTTP | CURLPROTO_HTTPS,
            CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTP | CURLPROTO_HTTPS,
            CURLOPT_CERTINFO => TRUE,
            CURLOPT_LOW_SPEED_LIMIT => 200,
            CURLOPT_LOW_SPEED_TIME => 50,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
            CURLOPT_ENCODING => 'gzip,deflate',
            CURLOPT_URL => $parsedUrl,
        ]);
    $response = curl_exec($curl);
    $info = curl_getinfo($curl);
    $error = curl_error($curl);
    $headers = trim(substr($response, 0, curl_getinfo($curl, CURLINFO_HEADER_SIZE)));
    $content = substr($response, curl_getinfo($curl, CURLINFO_HEADER_SIZE));

    curl_close($curl);

    libxml_use_internal_errors(true);

    $domDoc = new DOMDocument();
    print_r($domDoc->encoding); // It's OK => UTF-8
    // Got   or s’ or &eacute etc....
    print_r($domDoc->saveHTML());

它似乎是帶有meta元素的HTML5文檔類型,例如<meta charset=utf-8">

如果我添加字符集元標記<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ,那似乎還可以。

$domDoc->loadHTML('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">' . $content);
// No &ensp; or s&rsquo; or &eacute etc....
print_r($domDoc->saveHTML());

您認為這是正確的解決方案嗎?

我找到原因了。

DOM擴展基於libxml2構建,其HTML解析器是為HTML 4編寫的。如果HTML5 doctype和諸如此類的meta元素<meta charset="utf-8"> HTML代碼將被解釋為ISO-8859,而不是ASCII字符將轉換為HTML實體。

但是,類似HTML4的版本將可以運行<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

參考: UTF-8與PHP DOMDocument loadHTML嗎?

暫無
暫無

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

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