向浏览器发送数据时,我如何知道 PHP 将使用什么编码?即带有 Cotent-Type 标头,例如:iso-8859-1。
6 回答
您可以使用 William 建议的 header() 解决方案,但是如果您正在运行 Apache,并且 Apache 配置使用默认字符集,那么每次都会获胜(Internet Explorer 会发疯)请参阅:AddDefaultCharset
请记住,内容类型和编码是两个不同的东西。text/html 是一个内容类型;ISO-8859-1 和 UTF-8 是编码。
服务器发送的 HTTP 响应标头通常如下所示:
Content-Type: text/html; charset=utf-8
“charset”实际上是字符编码。它不在单独的标题中;但是有一个名为“Content-Encoding”的标头实际上指定了响应使用的压缩类型(例如 gzip)。
如果要将字符编码更改为 UTF-8,请在包含 HTML 的文件中:
<?
header("Content-Type: text/html; charset=utf-8");
通常 webhosters 的 Apache + PHP 服务器被配置为发送NOcharset
标头。测试服务器配置方式的最短方法是:
- 使用此工具通过在您的网站上获取您的任何一个页面来查看服务器标头。如果您在服务器标头中看到 a
charset
,则表示您的服务器正在使用它,通常它不会包含charset
. - 另一种方法是在您的服务器上运行这个简单的脚本:
<?php echo ini_get('default_charset'); ?>
如上所述,这通常会打印出一个空字符串,如果不同,它将向您显示charset
PHP 的。
第二个解决方案是假设 Apache 没有配置,AddDefaultCharset some_charset
这通常不是这种情况,但在这种情况下,我担心 Apache 设置可能会覆盖 PHP deafult_charset ini 指令。
你可以设置你自己的header('Content-type: xxx/yyy');
,但我相信 text/html 是默认发送的。
AFAIK,PHP 按字节发送字符串。也就是说,如果您的变量包含 UTF-8,它将发送 UTF-8。如果你有 iso-8859-1,它也会发送。如果你把它们混合起来,它不会很漂亮。
如果您的服务器未配置为具有默认内容或字符集,PHP 也没有,则 PHP 将仅发送Content-Type: text/html
- 它根本不会指定字符集,并将发送它在脚本中看到的字节。
如果浏览器接收到没有指定字符集的页面,可能会发生各种情况:
- 大多数浏览器都有“编码/字符集”菜单;如果用户明确选择一个,浏览器将尝试应用它。不会经常发生,所以:
- 一些浏览器尝试使用默认字符集呈现它(这取决于区域设置,例如,对于 FF 和 cs_CZ,它曾经是
iso-8859-2
;YMMV) - IE 将尝试以启发式方式确定字符集(它会根据字符分布进行猜测 - 很多时候它是正确的;有时它会出错,你会得到一个罗马尼亚语页面被解释为中文文本,这通常意味着“不可读")
- 一些旧浏览器将重新使用
us-ascii
如果使用此过程,PHP 脚本的字符集和浏览器的字符集匹配,则文本将 - 意外 - 可读。如果没有,就会出现奇怪的迹象和类似的现象。