当浏览器以'ISO-8859-1'作为元字符集时,页面被检测为UTF-8
我正在处理网站转移,并且在这个过程中我的字符集被玷污了。起初,我转移了所有文件而没有任何改动,新服务器上的文件显示了用于特殊字符的<?>
图标。浏览器的字符编码(Chrome和FF)告诉我它是自动检测UTF-8的。元字符集页面设置为ISO-8859-1。复制是从多个数据库中的各种表中抽取的(不要问)。当浏览器以'ISO-8859-1'作为元字符集时,页面被检测为UTF-8
在原始网站上,全部显示为应该显示。在新网站上,<?>
...我挖掘到它,在php.ini中找到默认字符集=“UTF-8”,将其设置为无。现在网站上的大多数页面都显示正常,浏览器可以识别meta charset标签,每个人都很开心;也就是说,直到我导航到根目录的文件夹。
尽管它们的meta charset是ISO-8859-1,但是该文件夹中的文件以某种方式告诉浏览器被读为UTF-8,这意味着我在这些页面上看到<?>
。如果我将浏览器设置为ISO-8859-1,则显示正常。自动检测将其重置为UTF-8。有任何想法吗?
谢谢!
更新(从注释下添加的):
我通过W3C checker跑页的建议martinstoeckli,它告诉我,HTTP内容类型是Content-Type: text/html; charset=utf-8
而meta标签是<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
,这给我一个冲突字符编码声明错误。疯狂的事情是,我不能为了我的生活找出UTF-8声明来自哪里!它没有任何文件,所有文件都保存为UTF-8,不包含BOM,php.ini设置为声明无默认值,文件夹的.htaccess设置与PatomaS建议的类似。
(对于它的价值,Mozilla的网页嗅探器确认的text/html; charset=utf-8
HTTP标头的Content-Type。)
更新: 尽管我们没有达成解决这个问题,因为我提出的,我也决定解决我的字符编码问题的最佳方法是重构所有内容以使用UTF-8编码。当然,这可能意味着你会在这里看到更多令人兴奋的新手问题,比如“为什么不用utf8-encode()来做我的łùùñdrÿ?”
当然,这意味着神秘仍然是:什么导致服务器发送UTF-8的HTTP内容类型字符集标题时,似乎一切配置不同?
文件中是否有BOM(字节顺序标记)。要确保使用notepad ++打开文件并检查编码菜单,还可以选择转换为ansi作为测试选项。
随处使用utf-8是一个更好的长期方法,我可以建议。
对于所有类型的编码问题,有一个美妙的W3-checker。
谢谢你。我通过这个检查器运行了页面,它告诉我HTTP Content-Type是'Content-Type:text/html; charset = utf-8',而meta标签是',这给了我一个**冲突的字符编码声明**错误。疯狂的事情是,我不能为了我的生活找出UTF-8声明来自哪里!它没有任何文件,所有文件都保存为UTF-8,不包含BOM,php.ini设置为声明无默认值,文件夹的.htaccess设置与PatomaS建议的类似。 帮助? – somewhatsapient
@somewhatsapient - 那么看起来我很清楚,你在meta标签中声明了ISO-8859-1的页面,但是你将该文件存储为UTF-8。这是行不通的。如果你希望它是ISO-8859-1,你应该告诉你的编辑器(Sublime)使用这种编码,而不是UTF-8。如果您希望它是UTF-8,则需要在元标记中将其声明为UTF-8。文件和元标记的编码必须匹配。 – martinstoeckli
我试过这个,并没有解决问题。为了测试这一点,我还创建了一个死的简单的HTML文件,用''声明保存为UTF-8,并且问题没有出现;但是,如果我保存与.php完全相同的文件,我会得到冲突的声明。同样,这只发生在这个文件夹中。如果我将在HTTP和meta_to之间创建声明冲突的PHP文件移动到另一个文件夹,那么_它会干净地声明,并且只与meta标记声明一次。 – somewhatsapient
您可以为所有你想成为ISO-8859-1的文件中设置这根.htaccess
<FilesMatch "\.(htm|html|xhtml|xml|css|js|php)$">
AddDefaultCharset iso-8859-1
</FilesMatch>
记住,服务器头了直列头具有优先权。
我试过了,但没有任何明显的效果。谢谢你! – somewhatsapient
PHP 5。6带有一个新的默认charset指令设置为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)页面,你可以使用相同的方法强制编码,但不要使用iso-8859-1,而是使用utf- 8。再看那:
例如: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。这个冲突解决了!我终于用我的答案解决了。
即使您在您的代码中指定,看起来Apache可能会强制将字符集强制为默认值(UTF-8)。
此选项位于您的httpd.conf文件中,名为AddDefaultCharset。 您需要对其进行评论才能让您的代码掌控世界。
这解决了我的问题。
来源:https://major.io/2007/11/15/change-the-default-apache-character-set/
我用崇高的文本2,和所有的文件保存为UTF-8无BOM。从长远来看,我打算将所有内容都转换为UTF-8;现在,我必须让角色正确显示,然后进行下一步。谢谢您的回答! – somewhatsapient
我意识到试图解决这个问题就像是把马和车轮放进购物车,问我为什么没有到达任何地方。我接受这个答案,因为即使它没有具体解决这个问题(为什么服务器发送异常的HTTP charset头?),它通过推荐一个明智的长期解决方案来解决较差的编码实践问题。 – somewhatsapient
这里有关于声明问题的一个很好的解释; http://www.w3.org/International/questions/qa-html-encoding-declarations btw你也可以尝试.htaccess添加字符集解决方案和解释在http://www.justskins.com/forums/php4- 1-2-incorrect-7845.html,cys –