Browser displays ? instead of ′
我有一个包含以下文本的PHP文件:
在一台服务器上,它显示为:
在另一个方面,如:
为什么会有区别,我该怎么做才能使其正确显示(作为撇号)?
所有人注意(以备将来参考)
我实现了Gordon / Gumbo的建议,只是我在服务器级别而不是应用程序级别实现了它。 请注意,(a)我必须重新启动Apache服务器,并且更重要的是,(b)我必须用正确的编码中的校正后的数据替换现有的"不良数据"。
/etc/php.ini
default_charset =" iso-8859-1"
-
对我来说似乎是一个编码问题。无论如何,为什么不像其他所有人一样使用代替? :D
-
检查返回文档的字符集(标题),可能有解释,在任何情况下都可以使用
-
而且病态添加:这闻起来像Word复制/粘贴
-
它不是ASCII单引号x27。它可能是Windows"左单引号" x92,仅在MS代码页中受支持。
-
@Chouchenos:是的,(U + 00B4,ACUTE ACCENT)显然是错误的字符。我想他更想说的是’(U + 2019,正确的单引号),它将是正确的印刷撇号。
-
除了针对此问题的具体建议之外,Id始终建议您阅读Joel Spolskys,绝对绝对是每个软件开发人员绝对肯定要了解的Unicode和字符集(无借口!),如果您还没有:)
-
对于使用数据库(例如MySQL)的PHP应用程序,用" U + FFFD EF BF BD替换字符"替换" U + 2019 E2 80 99正确的单引号"的另一个原因是在Windows中缺少" charset = utf8"" new PDO"行。
您必须确保以正确的字符集提供内容:
使用包含以下内容的标头发送内容
1
| <?php header("Content-Type: text/html; charset=[your charset]"); ?> |
或-如果HTTP charset标头不存在-将元素插入:
1
| <meta http-equiv="Content-Type" content="text/html; charset=[your charset]" /> |
就像属性名称建议的那样,http-equiv等效于HTTP响应标头,如果未设置相应的HTTP标头,则用户代理应使用它们。
就像Hannes在问题注释中已经建议的那样,您可以查看Web服务器返回的标头,以查看其提供的编码。两台服务器之间可能存在差异。因此,将上面的[your charset]部分更改为"工作"服务器的部分。
有关原因的详细说明,请参见Gumbo的答案。
-
您怎么知道他的文档是UTF-8?
-
更重要的是:数据似乎未以UTF-8编码。
-
@Gordon:我想按正确的顺序查看建议:首先是HTTP,然后是HTML(并且只有在HTTP中未指定编码的情况下)。
-
@Gumbo好的,更改顺序,尽管我很确定拥有META完全没有害处。它之所以称为http-equiv是有原因的。当没有等效的http标头时,用户代理应使用它。
-
@戈登:是的,如果在HTTP中指定了字符编码,则META根本不起作用。这就是在某些情况下META不足的原因。
-
@Gumbo某些情况并非全部都是:)它是一个后备。同样,即使没有使用文档中的文档元信息,也可以使文档完整。
-
@Gordon,@Gumbo-两台服务器上我的应用程序没有区别,但是Apache / PHP可能有所不同-我应该检查什么(在phpinfo中?)并进行匹配,以便两者都能类似地工作...
-
@matt,请比较您的Apache网络服务器在请求页面时将返回的Response标头。您可以使用Firefox的Firebug或IE的Fiddler来做到这一点。
-
@Gordon-我的代码输出,但是第二台服务器上的phpinfo()说:" HTTP响应标头内容类型text / html; charset = UTF-8"
-
@matt,它在另一台服务器上怎么说?哪一个显示正确的答案?
-
@Gordon-phpinfo()不会显示任何内容,但是页面上的萤火虫调查显示,"请求标头"为" Accept-Language zh-cn,en; en; q = 0.5 Accept-Encoding gzip,deflate Accept-Charset ISO- 8859-1,utf-8; q = 0.7,*; q = 0.7","响应标头"是"随心接受编码,用户代理内容编码gzip"
-
@matt和?出现在以UTF-8响应的服务器上,对吗?大概就像我们当时建议的那样。一台服务器发送编码信息,而另一台不发送。发送UTF-8编码的代码将覆盖通过META设置的ISO-8859-1,因为META只是一个备用。尝试使用PHP覆盖标头,如上所示。
-
@Gordon,在php.ini中切换到iso-8859-1并重新启动apache导致某些字符正确显示,但其他字符显示为Quines somos,Explra
-
@matt请按照上面和答案中的建议进行操作。发送标题。另外,您是否检查过错误的字符是否实际上是ISO-8859-1的一部分?如果不是,则必须将它们编码为各自的HTML实体。
REPLACEMENT CHARACTER ?(U + FFFD)的显示很可能意味着您将输出指定为Unicode,但数据未指定。
在这种情况下,例如,如果ACUTE ACCENT ′是使用ISO 8859-1编码的,则它使用字节序列0xB4进行编码,因为这是ISO 8859-1中该字符的代码点。但是在像UTF-8这样的Unicode编码中,该字节序列是非法的。在这种情况下,将显示替换字符U + FFFD。
因此,要解决此问题,请确保根据实际情况正确指定字符编码(反之亦然)。
总结一下:
确保保存在Web服务器上的FILE具有正确的编码
确保Web服务器还以正确的编码提供它
确保将HTML元标记设置为正确的编码
确保使用"标准"特殊字符,即使用"而不是"来编写类似" Luke Skywalker的代码"的代码
对于编码,UTF-8可能对您有益。
如果这个答案有帮助,请标记为正确或投票。谢谢
简单的解决方案是对特殊字符使用ASCII码。
ASCII中的撇号字符的值为。尝试将此值放入您的HTML中,它应该可以正常工作。
-
ASCII只有一个撇号字符,即0x27。字符引用表示Unicode中的字符U + 2019右单引号。
-
@Gumbo:正确的单引号是撇号的正确字符:languagegeek.com/typography/apostrophes.html
-
我认为他的意思是是纯ascii字符串,而不是它所代表的字符是ascii。
-
@RoToRa:我想指出的是,US-ASCII仅包含一个撇号字符,并且字符引用是指Unicode中的字符。除此之外,U + 2019并不是每种语言都适合的印刷撇号。但是,是的。
这可能是由于您要插入到页面中的数据导致的,而PHP使用的是与页面本身不同的字符编码(最常见的迭代是拉丁1和另一UTF-8)。
检查用于页面和数据库的编码。可能会有不匹配的情况。
将浏览器的字符集设置为定义的值:
例如,
1
| <meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
在根目录中创建一个.htaccess文件:
1 2 3 4 5 6
| AddDefaultCharset utf-8
AddCharset utf-8 *
<IfModule mod_charset.c>
CharsetSourceEnc utf-8
CharsetDefault utf-8
</IfModule> |