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,但我总是看到带有问号而不是 áéíóúãõç 的页面。
当我直接在浏览器中打开页面时,一切正常。为什么会这样?
在我看来,这可能只是编码细节丢失的问题。
您所描述的是:
- 从网络服务器请求文档,指定编码 8859-1
- 服务器以请求的编码响应文档,包括 header 指定编码 是 8859-1。这在浏览器中看起来是正确的。
- 从php输出文档(但不是header数据!)(未指定
- 在某种查看器中打开数据。
看到编码规范丢失的地方了吗,在第 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 - 它是另一个 不正确 字节集。
要解决此问题,请在查看数据或将数据保存到数据库时指定编码。
我正在尝试使用 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,但我总是看到带有问号而不是 áéíóúãõç 的页面。
当我直接在浏览器中打开页面时,一切正常。为什么会这样?
在我看来,这可能只是编码细节丢失的问题。
您所描述的是:
- 从网络服务器请求文档,指定编码 8859-1
- 服务器以请求的编码响应文档,包括 header 指定编码 是 8859-1。这在浏览器中看起来是正确的。
- 从php输出文档(但不是header数据!)(未指定
- 在某种查看器中打开数据。
看到编码规范丢失的地方了吗,在第 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 - 它是另一个 不正确 字节集。
要解决此问题,请在查看数据或将数据保存到数据库时指定编码。