3

我正在处理站点转移,在此过程中我的字符集被弄乱了。起初,我将所有文件原封不动地传输,新服务器上的文件显示<?>特殊字符的图标。浏览器的字符编码(Chrome 和 FF)一目了然,告诉我它正在自动检测 UTF-8。页面的元字符集设置为 ISO-8859-1。副本是从多个数据库中的各种表中提取的(不要问)。

在原始站点上,所有内容都按应有的方式显示。在新站点上,<?>...我深入研究了它,在 php.ini 中找到了默认字符集 =“UTF-8”,将其设置为空。现在网站大部分页面显示正常,浏览器识别元字符集标签,大家开心;也就是说,直到我导航到根目录下的文件夹。

这个文件夹中的文件,虽然它们的元字符集是 ISO-8859-1,但不知何故告诉浏览器被读取为 UTF-8,这意味着我<?>在这些页面上看到了。如果我将浏览器设置为 ISO-8859-1,则显示正常。自动检测将其重置为 UTF-8。有任何想法吗?

谢谢!

更新(从下面的评论中添加):

我按照 martinstoeckli 的建议通过W3C 检查器运行该页面,它告诉我 HTTP Content-Type 是Content-Type: text/html; charset=utf-8而元标记是<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>,这给了我一个冲突字符编码声明错误。疯狂的是,我一生都无法弄清楚 UTF-8 声明的来源!它不在任何文件中,所有文件都保存为 UTF-8 不带 BOM,php.ini 设置为声明无默认值,文件夹的 .htaccess 设置为 PatomaS 建议的那样。

(值得一提的是,Mozilla 的 Web Sniffer 确认 HTTP 标头 Content-Type 为text/html; charset=utf-8.)

更新: 虽然我们没有像我提出的那样解决这个问题,但我确实决定解决我的字符编码问题的最佳方法是重构所有内容以使用 UTF-8 编码。当然,这可能意味着您会在这里看到我提出更多令人兴奋的新手问题,例如“为什么 utf8-encode() 不做我的 łâùñdrÿ?”

当然,这意味着谜团仍然存在:当一切似乎都配置不同时,是什么导致服务器发送 UTF-8 的 HTTP 内容类型字符集标头?

4

5 回答 5

4

文件中是否可能包含 BOM(字节顺序标记)。为确保使用 notepad++ 打开文件并检查编码菜单,您还可以选择转换为 ansi 作为测试选项。

顺便说一句,我可以建议在任何地方使用 utf-8 是一种更好的长期方法。

于 2012-10-21T04:16:11.233 回答
4

有一个很棒的W3-checker可以解决所有类型的编码问题。

于 2012-10-21T06:52:04.670 回答
4

PHP 5.6 带有一个新的默认字符集指令设置为UTF-8,在某些情况下,这可能是在元标记中作为 latin1 提供的页面的问题,并且可能是验证服务冲突的原因,您可以通过调用ini_set('default_charset', 'iso-8859-1')脚本来覆盖此指令。

为此,请在脚本开头将这段代码编码为 latin1 的每个 php 文件:

例子:index.php

<?php
  $server_root = realpath($_SERVER["DOCUMENT_ROOT"]);
  $config_serv = "$server_root/php/config.php";
  include("$config_serv");
?>

然后在您的根网站下创建一个文件夹“php”并将这段代码放入config.php

例子:config.php

<?php
  ##########################################################################
  # Server Directive - Override default_charset utf-8 to latin1 in php.ini #
  ##########################################################################
  @ini_set('default_charset', 'ISO-8859-1');
?>

如果您的 php.ini 设置为 latin1 ( ISO-8859-1) 并且您想要提供 utf-8 (unicode) 页面,您可以使用相同的方式强制编码,但使用 utf-8 代替 iso-8859-1。看那个:

例子:config.php

<?php
  ##########################################################################
  # Server Directive - Override default_charset latin1 to utf-8 in php.ini #
  ##########################################################################
  @ini_set('default_charset', 'UTF-8');
?>

我希望你觉得我的回答有用,我以这种方式解决了我的问题!我在使用 firefox 及其 html/css 验证器时遇到问题,该验证器将我的页面设为 latin1,将标题设为 utf-8。这个矛盾解决了!我终于用我的答案解决了。

于 2015-03-07T15:34:58.237 回答
0

您可以在您的根目录.htaccess中为您希​​望成为 iso-8859-1 的所有文件设置此项

<FilesMatch "\.(htm|html|xhtml|xml|css|js|php)$">
    AddDefaultCharset iso-8859-1
</FilesMatch>

请记住,服务器标头优先于内联标头。

于 2012-10-21T13:40:57.780 回答
0

即使您在代码中指定它,Apache 似乎也可以强制将字符集设置为默认值 (UTF-8)。

此选项位于您的 httpd.conf 文件中,称为 AddDefaultCharset。您需要对其进行注释以让您的代码统治世界。

这解决了我的问题。

来源:https ://major.io/2007/11/15/change-the-default-apache-character-set/

于 2015-11-27T20:01:55.810 回答