【问题标题】:file_get_contents() breaking ISO-8859-1 encodingfile_get_contents() 打破 ISO-8859-1 编码
【发布时间】:2016-04-05 16:17:28
【问题描述】:

我正在尝试使用 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,但我总是得到一个带有问号而不是 áéíóúãõç 的页面。

当我直接在浏览器中打开页面时,它工作得很好。为什么会这样?

【问题讨论】:

  • 小心,你已经写好了你的用户名和密码;这可能对您或网站不利?我已经尝试过你的代码(复制/过去)并且编码没问题
  • header('Content-Type: text/html; charset=iso-8859-1'); echo $file; 指定使用哪种编码来读取$file
  • 我不太确定 file_get_contents 是否关心 - 它只是 file_get_contents 的字节流,对吧?我怀疑问题是当您查看结果时,您没有在 8859-1 中查看。
  • 你可以说Accept-Charset: iso-8859-1。但不能保证服务器会以该编码向您发送数据。
  • @JoãoMiranda 不要忘记更改您的测试用户名和密码。他们仍然在这个问题的历史中,并且仍然被抓住它的人和查看历史的人所知道。而且它们仍然有效。

标签: php html http character-encoding iso-8859-1


【解决方案1】:

在我看来,这可能只是编码细节丢失的问题。

你所描述的是:

  1. 从网络服务器请求文档,指定编码 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 - 它又是一个不正确一组字节。

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

【讨论】:

  • 我不得不将我的 mysql 数据库更改为 latin1,然后它似乎已经奏效了。虽然不是理想的,但它奏效了。所以谢谢!
  • 如果你想 store 在 utf8 你可以设置你的 client 字符集为 latin1 然后它会被 mysql 自动连接
猜你喜欢
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2018-02-21
  • 2012-02-17
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多