自php 5.4起 html_entity_decode 引入了四个新标志,并带有最少的解释
ENT_HTML401 Handle code as HTML 4.01.
ENT_XML1 Handle code as XML 1.
ENT_XHTML Handle code as XHTML.
ENT_HTML5 Handle code as HTML 5.
我想了解他们的目的。在哪些情况下有意义?
我的猜测(但我可能错了)是,任何不同的标准都对一些不寻常的字符进行编码,而对其他字符则没有,因此为了尊重它们,它们在这里。
我的研究: htmlentities 具有相同的基本解释,也没有示例。我没有运气谷歌。
当我在htmlspecialchars页面上看到这些常量时,我开始怀疑这些常量的行为。该文档是垃圾,因此我开始研究PHP的源代码。
基本上,这些常数会影响某些实体是否已编码(或解码html_entity_decode
)。最明显的影响是撇号('
)是编码为'
(for
ENT_HTML401
)还是'
(for
other)。同样,它确定使用时是否'
已解码html_entity_decode
。('
始终被解码)。
所有用法都可以在ext / standard / html.c及其头文件中找到。从ext / standard / html.h:
#define ENT_HTML_DOC_HTML401 0
#define ENT_HTML_DOC_XML1 16
#define ENT_HTML_DOC_XHTML 32
#define ENT_HTML_DOC_HTML5 (16|32)
(替换ENT_HTML_DOC_
用ENT_
得到他们的PHP常量名)
我开始寻找这些常量的所有出现情况,并且可以就ENT_*
常量的行为共享以下内容:

被解码为不可读/无效字符ENT_HTML401
,和ENT_XHTML
和ENT_XML1
。对于ENT_HTML5
然而,这被视为无效字符,因此它停留
。(C函数unicode_cp_is_allowed)ENT_SUBSTITUTE
启用,无效的代码单元序列中 用于一个指定的字符集 被替换�
。(不取决于文档类型!)ENT_DISALLOWED
启用,代码点 被禁止指定文档类型 将被替换�
。(不取决于字符集!)ENT_IGNORE
,ENT_SUBSTITUTE
删除相同的无效代码单元序列,并且不进行替换(例如,取决于“文档类型”的选择ENT_HTML5
)
对ENT_HTML5
(线976)ENT_XHTML
与共享实体图ENT_HTML401
。唯一的区别是'
它将转换为单引号,ENT_XHTML
而while ENT_HTML401
不会将其转换(请参见此行)ENT_HTML401
并ENT_XHTML
使用完全相同的实体图(减去上一点的差异)。ENT_HTML5
使用自己的地图。其他(目前ENT_XML1
)具有非常有限的解码图(>
,&
,<
,'
,"
和它们的数字等同物)。(请参见C函数unescape_inverse_map)htmlspecialchars
)时ENT_XML1
,除之外,所有实体映射将使用与相同的实体ENT_HTML401
。那一个不会用'
,但是'
。这几乎涵盖了所有内容。我不会列出所有实体差异,而是要针对一些包含以下内容的文本文件指向https://github.com/php/php-
src/tree/php-5.4.11/ext/standard/html_tables
每种类型的映射。
当使用htmlspecialchars
与ENT_COMPAT(默认)或ENT_NOQUOTES,这不要紧,你挑(见下文)之一。我在SO上看到了一些答案,可以归结为:
<input value="<?php echo htmlspecialchars($str, ENT_HTML5);?>" >
这是 不安全的 。它将覆盖默认值ENT_HTML401 | ENT_COMPAT
,其具有的区别在于HTML5实体使用,但 也
认为引号不再逃脱!另外,这是冗余代码。必须由被编码的实体htmlspecialchars
是所有相同的ENT_HTML401
,ENT_HTML5
等
只需使用ENT_COMPAT
或ENT_QUOTES
代替。当您对属性使用撇号(value='foo'
)时,后者也适用。如果您只有的两个参数htmlspecialchars
,则不要包含任何参数,因为它是默认参数(ENT_HTML401
为0,还记得吗?)。
如果要在页面上打印某些内容(在标签之间,而不是属性之间),则选择哪一个都没有关系,因为它具有相同的效果。使用ENT_NOQUOTES | ENT_HTML401
等于数字值甚至足够0
。
另请参阅以下有关ENT_SUBTITUTE和ENT_DISALLOWED的信息。
如果您的文本编辑器或数据库太笨拙,以致您不能包含非US-
ASCII字符(例如UTF-8),则可以使用htmlentities。否则,请保存一些字节并改用htmlspecialchars(请参见上文)。
无论您需要使用ENT_HTML401
,ENT_HTML5
或别的东西取决于你的页面是如何提供服务。当您有HTML5页面(<!doctype html>
)时,请使用ENT_HTML5
。XHTML或XML?使用相应的ENT_XHTML
或ENT_XML1
。如果没有doctype或纯HTML4,请使用ENT_HTML401
(省略时是默认值)。
默认情况下,将删除 对给定字符集无效的
字节序列。要�
代替无效的字节序列,请指定ENT_SUBSTITUTE
。(请注意,这&#FFFD;
是针对非UTF-8字符集显示的)。ENT_IGNORE
但是,当您指定时,即使指定,也不会显示这些字符ENT_SUBSTITUTE
。
指定时, 文档类型的
无效字符将被上述相同的替换字符(或其实体)替换ENT_DISALLOWED
。无论是否进行ENT_IGNORE
设置,都会发生这种情况(这与文档类型的无效字符无关)。
问题内容: 我知道这不仅适用于Java,而且适用于许多语言,但这是我最熟悉的语言。 我了解修饰符的作用以及如何使用它们。我只想知道,为什么我们需要它们?为什么每个对象都无法访问,无论是否需要访问? 问题答案: 当您必须维护更大的项目时,原因变得更加明显。当方法或变量是公共的时,对它进行更改时必须小心,因为您永远不知道代码库的哪些部分依赖于它的确切行为。 但是,当变量或方法是私有的时,您会知道该变量
问题内容: 我对php中的访问修饰符完全感到困惑。关于访问修饰符的内存利用率是否存在任何差异,或仅具有可访问性的差异。请提出建议。如果我有以下代码: 现在谁能告诉我,在变量或函数上方将发生多少内存。 问题答案: 不,访问修饰符对Java或PHP或我所听说的任何其他语言的运行时内存利用率均无影响。 可能由于某些字节码中的访问修饰符(取决于编码方式),代码大小可能会增加几个字节。您的程序在其他方面必须
本文向大家介绍使用Python打开文件时,“ b”修饰符有什么作用?,包括了使用Python打开文件时,“ b”修饰符有什么作用?的使用技巧和注意事项,需要的朋友参考一下 'b'修饰符打开以二进制模式指定的文件。“二进制”文件是格式不由可读字符组成的任何文件。二进制文件的范围可以是图像文件(例如JPEG或GIF),音频文件(例如MP3)或二进制文档格式(例如Word或PDF)。在Python中,默
本文向大家介绍使用Python打开文件时,“ U”修饰符有什么作用?,包括了使用Python打开文件时,“ U”修饰符有什么作用?的使用技巧和注意事项,需要的朋友参考一下 在具有通用换行符支持的Python中,mode参数也可以是“ U”,表示“打开以通用换行符解释的文本文件形式输入”。这是跨平台支持所必需的,因为Unix os上的换行用单个字符\ n表示,而Windows上的换行用2个字符\ r
为什么字段resultsqueue的修饰符重复?即使当我将resultQueue名称更改为每隔一个名称时,仍然会得到这个错误。当我在main函数中移动resultsQueue时,我不会得到这个错误。 这是我的代码:
private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只