什么情况下应该使用HTML实体?

139
这个问题困扰我有一段时间了。随着UTF-8作为网络开发中事实上的标准的出现,我不确定在哪些情况下应该使用HTML实体,哪些情况下应该直接使用UTF-8字符。例如:
  • 破折号(–,&emdash;
  • 和号(&,&
  • 三分之四(¾,¾
请对这个问题进行解答。非常感谢!

顺便问一下,PHP中的htmlentities()函数会做什么? - Joe Phillips
从阅读答案和评论来看,我觉得还没有普遍的规则支持其中之一,答案仍然是“取决于情况”。 - Majid Fouladpour
8个回答

130
根据我收到的评论,我进一步研究了一下。目前看来最佳实践是放弃使用HTML实体,改用实际的UTF-8字符。列出的原因如下:
  1. 对于了解字符含义并知道如何输入的人来说,UTF-8编码更易阅读和编辑。
  2. 对于不理解它们的人来说,UTF-8编码与HTML实体编码一样难以理解,但它们有一个优势,即呈现为特殊字符,而不是难以理解的十进制或十六进制编码。
只要您的页面编码正确设置为UTF-8,就应该使用实际字符而不是HTML实体。我阅读了几篇有关此主题的文章,但最有帮助的是: 从“UTF-8:字符编码的秘密”文章中得知:

维基百科是一个很好的案例研究,它最初使用ISO-8859-1,但在支持外语变得过于繁琐时切换到了UTF-8。机器人现在会浏览文章并将字符实体转换为相应的真实字符,以提高用户友好性和可搜索性

该文章还给出了一个涉及中文编码的好例子。以下是简化版本: UTF-8: 這兩個字是甚麼意思 HTML 实体:

這兩個字是甚麼意思

对于我来说,UTF-8和HTML实体编码都是毫无意义的,但至少UTF-8编码可以被识别为一种外语,并且在编辑框中会正确渲染。文章继续介绍了有关HTML实体编码版本的以下内容:

对于那些真正知道什么是字符实体的人来说,极其不方便,而对于不知道的可怜用户来说则完全无法理解!即使是稍微更加用户友好、“可理解”的字符实体,如θ,也会让不想学习HTML的用户感到困惑。然而,如果他们在编辑框中看到了θ,他们将知道它是一个特殊字符,并相应地处理它,即使他们不知道如何自己写出该字符。

正如其他人指出的,您仍然需要使用HTML实体来保留预留的XML字符(&,小于号,大于号)。


这个答案非常有帮助。但是为了澄清,为了我自己的理解:在声明了UTF-8字符集的HTML文档中使用&entity;语法没有任何风险或无效之处,对吗?虽然出于您列出的原因,纯UTF-8字符更好,但在同一文档中仍然可以使用一些HTML实体,这没有问题吗? - Jacob Ford
@JacobFord 没错,将HTML实体与UTF-8字符混合使用并不会有风险或无效,只是可能会让阅读源代码的人感到困惑。 - William Brendel
我同意,有时候输入¾比在某个Unicode查找表中找到¾字符要容易一些。 - pbarney

96

如果您的编辑器支持Unicode,通常不需要使用HTML字符实体。但在以下情况下,实体可能会很有用:

  • 您的键盘不支持您需要输入的字符。例如,许多键盘上没有em-dash或版权符号。
  • 您的编辑器不支持Unicode(几年前很常见,但今天可能不是了)。
  • 您想在源代码中明确表示正在发生的事情。例如,“ ”代码比相应的空格字符更清晰。
  • 您需要转义HTML特殊字符,如“<”,“&”或“"”。

1
非常有帮助。谢谢。我使用一个有用的程序来获取不寻常的字符。它叫做PopChar,由Ergonis制作,但仅适用于OS X。 - allesklar
3
旁注:维基百科仍然要求使用&nbsp;而不是实际的空格字符,部分原因是因为Firefox会将U+00A0转换为表单中的U+0020。因此,在这种情况下使用该实体是确保源代码在Firefox用户编辑时不会出错的唯一方法。 - Joey
3
一个很好的总结,但是关于最后一点,通常需要转义的是 <,而不是 >(在属性值内只有很少情况下需要转义 ")。 - Jukka K. Korpela
保留   的另一个原因是可以在 HTML 页面上显示多个空格。 - zylstra
所以应该始终使用&amp;而不是&?这有什么原因吗? - Hashim Aziz
@Hashim:否则未转义的&会存在歧义,因为它既可以是字面上的&,也可以是实体的开始。在某些情况下,例如如果&紧接着空格,则不会产生歧义,但总是对其进行编码更安全。 - JacquesB

5

个人而言,我很久以前就开始使用utf-8,但是在html页面中,您始终需要将&、>和<字符转换为它们的等效实体&amp;、&gt;和&lt;

此外,如果您打算使用utf-8文本进行编程,则需要注意一些问题。

  • 使用实体时,XML需要一些额外的行来验证。
  • 某些库与utf-8不兼容。例如,在某些Linux发行版中,PHP在其正则表达式库中放弃了对utf-8的完全支持。
  • 更难限制使用html实体的文本中的字符数,因为单个实体使用多个字符。此外,总是有将实体切成两半的风险。

1
这只是一个非常小的问题,但没有要求编码大于(>)符号,只有小于(<)符号。 - Codemonkey

5

实体可能能够为您提供与不正确理解编码的客户端兼容性。我不认为这包括任何当前的浏览器,但您永远不知道其他种类的程序可能会出现问题。

更有用的是,HTML实体可以保护您免受自己的错误影响:如果您在服务器上配置出现错误,并且最终提供了一个带有HTTP标头的页面,该标头显示为ISO-8859-1和一个META 标签显示为UTF-8,那么至少您的 &mdash;es 将始终起作用。


6
然而,你也可以提出相反的观点——即使标题配置错误,“&mdash”能正确显示,这反而使问题更难被检测出来。 - Pekka

5

对于那些在视觉上容易混淆的字符,我不建议使用UTF-8编码。例如,很难区分破折号和减号,尤其是非断空格和空格。针对这些字符,一定要使用实体。

对于那些在视觉上容易理解的字符(如上面的中文示例),如果您喜欢,可以使用UTF-8编码。


4

HTML实体在生成要包含(动态地)在具有(多个)不同编码的页面中的内容时非常有用。例如,我们有白标内容被包含在ISO-8859-1和UTF-8编码的网页中...

如果字符集从/到UTF-8的转换不是如此混乱不堪(您总是会遇到一些无法正确转换的字符和工具),那么标准化UTF-8将是最好的选择。


2
如果您的页面已经正确地使用utf-8进行编码,那么您就不需要使用html实体,直接使用所需字符即可。

3
我认为您仍然需要它们来编码保留字符。 - rmeador
@rmeador - 我同意。 - Otávio Décio

2

之前的回答都很有道理。

另外:这主要取决于你打算使用的编辑器和文档语言。对于编辑器的最低要求是它支持文档语言。也就是说,如果你的文本是日语,请注意不要使用一个不显示它们的编辑器(例如没有实体用于文档本身)。如果是英语,你甚至可以使用一个类似vim的旧编辑器,只为相对罕见的&copy;等实体使用。 当然:&gt;和其他HTML特殊字符仍然需要转义。 但即使是其他拉丁-1语言(德语、法语等),写ä也很让人头疼……

此外,我个人会为看不见的字符和那些与标准ASCII相似并因此容易混淆的字符编写实体。例如,有u1173(在某些字符集中看起来像短横线)或u1175,看起来像竖杠。对于这些字符,我无论如何都会使用实体。


不需要使用>来表示>,可以直接使用>。但是必须使用<来表示<。 - Codemonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接