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. 从网络服务器请求文档,指定编码 8859-1
  2. 服务器以请求的编码响应文档,包括 header 指定编码 8859-1。这在浏览器中看起来是正确的。
  3. 从php输出文档(但不是header数据!)(未指定
  4. 在某种查看器中打开数据。

看到编码规范丢失的地方了吗,在第 3 步?

数据可以使用 8859-1 正确解码,但如果查看器配置为默认使用该编码,则只有 可以使用 8859-1 解码。某些应用程序可能默认为 8859-1,但现在 UTF-8 更为常见。

如果将数据加载到不同的存储引擎中,比如 mysql,问题可能会更加复杂。 mysql 将字符集与文本数据相关联。如果您的数据库默认为 utf-8,并且您没有告诉它数据实际上是 8859-1,但您没有告诉它数据是 8859-1,那么现在您正在向它提供假定的数据以 utf-8 编码,以后数据库中的数据将被这样处理。现在,即使您将来向数据库询问 8859-1,数据也会 re-encoded 从 utf-8 到 8859-1,但它不是有效的 utf-8 - 它是另一个 不正确 字节集。

要解决此问题,请在查看数据或将数据保存到数据库时指定编码。