file_get_contents显示额外的字符

时间:2014-10-03 11:49:44

标签: php utf-8 character file-get-contents

脚本应显示文件的内容,但如果开头和结尾的很多字符(超过8000个)添加了意外字符(不同文件的字符可能会更改)。

b15f
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...
</body>
</html>
0

b15f 0 在哪里?

脚本:

<?php
header("HTTP/1.1 200 OK");
header("Content-Type: text/html; charset=utf-8");
$content = file_get_contents( "index.html" );
echo($content);
?>

1 个答案:

答案 0 :(得分:0)

看起来你看到了大块长度。

您可能正在使用chunked encoding并将结果保存为原始状态。 HTTP具有不同的传输邮件正文的方式。最常见的是Content-Length,但只有在知道开始发送内容时的长度时才能执行此操作。这种方法的一个方便的方面是原始消息体不需要解码;你只需阅读Content-Length字节,那就是你的结果。

如果页面是动态的,有时您希望在知道全长之前开始向客户端写入字节。这是您使用分块编码时。每个块前面都有一个十六进制格式的块长度。在最后一个块为0之后,表示空块和传输结束。

服务器有一个8k缓冲区限制(例如,我认为这是PHP的默认值),这意味着在正文大于8k后,它会以块的形式发送。因此,在文件大于8k之后,您会在数据中散布大小块。

<强>解决方案:

ob_start();
echo($content);
header('Content-Length: '.ob_get_length());
ob_end_flush();