单引号在浏览器中显示为菱形问号(无数据库或 PHP)

Posted

技术标签:

【中文标题】单引号在浏览器中显示为菱形问号(无数据库或 PHP)【英文标题】:Single quotes showing as diamond shaped question mark in browsers (no database or PHP) 【发布时间】:2012-08-01 02:07:19 【问题描述】:

我正在处理一个将字符集从 iso-8859-1 切换到 utf-8 的网页。页面顶部是这样的:

<!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">
<head>
<title>[title of site]</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

我只在页面中使用 ASCII 字符,并且由于 utf-8 编码超集 ASCII,这应该没问题。但是,文本中的单引号显示为被黑色菱形包围的问号。我已经验证这些是 ASCII 单引号(不是直引号)。

我在网上阅读了很多描述解决问题的方法,这些解决方案涉及 php、魔术引号、数据库配置等。但是,这是一个没有任何程序呈现的平面 HTML 页面。

此外,许多遇到此问题的人被告知切换到 UTF-8 来解决问题。这正是我引入问题的方式。

请看http://mch.blackcatwebinc.com/src/events.html看这个问题。

【问题讨论】:

这些词如何出现在您的数据库中? 页面的来源没有有ASCII单引号。无论将文本放在那里,都将它们更改为其他内容,如果它们确实是原始源中的 ASCII 单引号(我真诚地怀疑)。 【参考方案1】:

ASCII 中唯一的引号是单引号 '(0x27 或 39)和双引号 "(0x22 或 33)。您所拥有的是 8 位编码,将引号放在 145 (0x91) 和 146 ( 0x92) 称为 CP1252;它是 Windows 的标准 8 位西欧编码。如果您想要的是 UTF-8,则需要将其转换为 UTF-8,因为它不是有效的 UTF-8;有效的 UTF-8 使用多个大于 127 (0x7F) 的字符的字节,并将开始和结束引号分别放在 U+2018 和 U+2019。

【讨论】:

你们都是对的。我已经在 vim 中查看了“掩盖症状”的文本 - 将引号显示为单引号,因为它将文件读取为 CP1252。我做了一个 'set encoding=utf8' 并保存了文件,单引号显示为 - 即引号作为它们的 CP1252 十六进制等效项。当更改为 ASCII (UTF-8) 单引号时,一切正常。我还需要设置我的 IDE CodeLobster 以将所有文件保存为 UTF-8。【参考方案2】:

根据 W3C,meta charset

应该尽可能靠近头部元素的顶部

来自http://www.w3.org/International/questions/qa-html-encoding-declarations#metacontenttype

所以,我可能会尝试将meta 标签放在title 上方。

另外,正如@user1505373 在第一个回答中提到的,UTF 总是大写,在我看到的任何示例中,= 之后都没有空格。

【讨论】:

【参考方案3】:

您的源代码不是保存在 UTF-8 中,而是 Latin1 CP1252,并且那些引号不是 简单的引号,但 U+2019 右单引号(以 Latin1 编码)。将源文件保存为 UTF-8 即可。

【讨论】:

它不是 Latin-1。它是 Windows 代码页 1252。在大多数情况下,CP1252 是 Latin-1 的超集,但它们仍然不一样。 好吧,不管它是什么,它都不是 UTF-8,即使它被声明为 UTF-8。我刚刚将浏览器切换到 Latin-1 并且它显示正确,这只是声明编码和实际编码不同的经典案例。 CP1252 经常用于 Latin-1,以至于大多数浏览器将 Latin-1 视为 CP1252,而 HTML5 要求它们这样做。【参考方案4】:

最简单的解决方法是将meta 标签中的UTF-8 更改为windows-1252。这是可行的,因为服务器在Content-Type 标头中声明没有编码,因此浏览器和其他客户端将使用meta 标记中指定的编码。

名称 windows-1252 是 8 位 Windows Latin-1 编码的首选 MIME 名称,也称为 cp1252 和一些其他名称(通常误称为“ANSI”)。

正如@deceze 解释的那样,数据的实际编码是 windows-1252,而不是 UTF-8。您也可以通过在创作软件中使用合适的命令保存文件来将实际编码更改为 UTF-8。但真正重要的是声明的编码与真实的编码匹配。

另一种可能性是对撇号使用“转义”,例如&amp;rsquo;。它们独立于编码工作,但它们使源代码不那么清晰。

【讨论】:

【参考方案5】:

我在您的标签和我正在处理的网站上看到的标签之间的唯一区别是分号后面的空格,而您的 utf 是小写的。尝试大写 UTF。

【讨论】:

刚在本地试了一下,没效果。还是那些问号。【参考方案6】:

所有 ASCII 可打印字符都有其等效的 HTML 实体代码。其中一些字符通常被大多数常见的操作系统字体支持,一些被归类为将我们带到您的呈现问题的符号。

您应该有一个 单引号,为了正确打印它,您应该使用它的实体代码或 ’分别。 如果它变成一个单引号,那么你应该使用 ‘而是。

请注意,两个 ASCII 字符(和 some more)没有 HTML 实体名称,因此您需要选择实体代码变体。

【讨论】:

没有 ASCII 结束单引号之类的东西。只有 128 以下的字符是 ASCII。 如果你有一个 21 世纪的名字,我很乐意更新上面的回复。请不要说撇号。 这是一个单引号。它可以用 CP1252 或 Unicode 或可能的其他几种字符编码进行编码。这不是 ASCII。 请不要推荐使用 HTML 实体来解决编码不匹配问题。

以上是关于单引号在浏览器中显示为菱形问号(无数据库或 PHP)的主要内容,如果未能解决你的问题,请参考以下文章

发送邮件后带有问号的php菱形

iphone sdk,撇号显示为问号

在 PHP 中读取 CSV 文件返回黑色菱形问号

php 单引号 双引号 ,php字符串/ hmtl / 数据库显示/ 及php的几个转化函数

用双引号或单引号打印 HTML 和 PHP 代码

显示带有问号的菱形等特殊字符的网站