簡體   English   中英

file_get_contents()打破ISO-8859-1編碼

[英]file_get_contents() breaking ISO-8859-1 encoding

我正在嘗試使用file_get_contents()閱讀頁面,但無法使字符編碼正常工作。

這是我的代碼:

    $username = "masked";
    $password = "maskedPass";
    $remote_url = 'https://utfws.utfpr.edu.br/aluno01/sistema/mplistahorario.inicio?p_curscodnr=212';

    // Create a stream
    $opts = array(
        'http'=>array(
            'method'=>"GET",
            'header' => array(
                "Authorization: Basic " . base64_encode("$username:$password"),
                'Accept-Charset: iso-8859-1'
            )

        )
    );

    $context = stream_context_create($opts);

    // Open the file using the HTTP headers set above
    $file = file_get_contents($remote_url, false, $context);

    echo $file;

我試圖將字符編碼更改為utf-8,但總是看到帶有問號的頁面,而不是áéíóúãúçç。

當我直接在瀏覽器中打開頁面時,它可以正常工作。 為什么會這樣呢?

在我看來,這可能只是丟失編碼細節的問題。

您要描述的是:

  1. 從Web服務器請求文檔,指定編碼8859-1
  2. 服務器以請求的編碼響應文檔,包括指定編碼 8859-1的標頭。 這在瀏覽器中看起來是正確的。
  3. 從php輸出文件(但不是標題數據!)(未指定輸出位置)
  4. 在某種查看器中打開數據。

在第3步中看到丟失了編碼規范的地方嗎?

可以使用8859-1正確解碼數據,但是只有在查看器默認配置為使用該編碼的情況下,才可以使用8859-1解碼數據。 某些應用的默認默認設置為8859-1,但如今UTF-8更為常見。

如果將數據加載到另一個存儲引擎(例如mysql)中,則問題可能更加復雜。 mysql將字符集與文本數據相關聯。 如果您的數據庫默認為utf-8,並且您沒有告訴它數據實際上是在8859-1中,但是您沒有告訴它數據是在8859-1中,那么現在您要向它提供假定的數據將其保存為utf-8,並且以后的數據將在數據庫中被同樣對待。 現在,即使您將來要求數據庫提供8859-1,數據也會從utf-8重新編碼為8859-1,但這不是有效的utf-8,這是另一組錯誤的字節。

要解決此問題,請在查看數據或將其保存到數據庫時指定編碼。

暫無
暫無

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

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