我在过去几年中做了很多PHP编程,让我讨厌的一件事就是对Unicode和多字节字符串的弱支持(当然,原则上没有)。例如,<!>“htmlentities <!>”;似乎是PHP世界中一个常用的函数,我发现当你努力保持每个字符串可以本地化,只在你的数据库中存储UTF-8,只提供UTF-8网页等时,它会非常烦人。突然间在你的数据库和浏览器之间的某个地方,这个绝对天真的函数假装每个字节都是一个字符,并且把一切搞得一团糟。

我只是只是抛弃这种功能,它们似乎完全是多余的。 这些天仍然需要写'<!> amp; auml;'而不是'<!>#228;'?至少我的Firefox似乎非常乐意显示最奇怪的亚洲字形,只要它们以正确的编码方式提供。

更新:更确切地说:除了显示HTML标签之外的任何其他内容都需要命名实体(如<!> quot; <!> amp; lt; <!> quot; for <!> quot; <!> lt; <!> quot;)

更新2:

@Konrad:你是说,不,不需要命名实体吗?

@Ross:但是在输入时清理用户输入是不是更好,以保持我的输出逻辑免受此类问题的影响? (当然,假设可以对输入进行可靠的消毒 - 但是,如果不是,可以输出吗?)

有帮助吗?

解决方案

<!>“真实<!>”中的命名实体不建议使用XHTML(即使用application/xhtml+xml,而不是更频繁使用的text/html兼容模式)。除了XML本身定义的五个(&lt;&gt;&amp;&quot;&apos;)之外,它们都必须在您正在使用的特定DocType的DTD中定义。这意味着您的浏览器必须明确支持DocType,这远非给定的。另一方面,编号实体显然只需要一个查找表来获得正确的Unicode字符。

至于你是否需要实体:你几乎可以期待任何现代浏览器都支持UTF-8。因此,只要您能保证数据库,标记和Web服务器都同意服务于此,就抛弃实体。

其他提示

如果使用XHTML,实际上建议不要使用命名实体([citation needed])。某些浏览器(Firefox <!>#8230;)在将其解析为XML(通常不会)时,不会读取DTD文件,因此无法处理实体。

无论如何最好使用UTF-8作为编码,如果没有其他令人信服的理由,这只意味着文档的创建者需要一个不仅可以处理文档而且还能提供良好文档的合适编辑器进入潜水员雕文的方式。 OS X实际上没有这个问题,因为大多数需要的字形都可以通过<!>#8220; alt <!>#8221;密钥,但Windows没有此功能。


  

@Konrad:你是说,不,不需要命名实体吗?

正。当然,除非有愚蠢的限制,例如阻塞UTF-8等的旧数据库驱动程序。

Safari似乎与某些字形有问题,但其他字形不一样,可能不是需要但最好这样做,当然,这是我的意见,除了我的支持自己的观察。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top