在纯Java中转义HTML符号的推荐方法是什么?
在以普通Java代码输出HTML时,是否有一种推荐的方法来转义在纯Java中转义HTML符号的推荐方法是什么?,java,html,escaping,Java,Html,Escaping,在以普通Java代码输出HTML时,是否有一种推荐的方法来转义、“和&字符?(即,手动执行以下操作除外) String source=“小于号(from: Apache Commons的替代方法:使用的htmlitls.htmlEscape(字符串输入)方法。出于某些目的: 有较新版本的,它使用不同的包名(org.apache.commons.lang3)。StringEscapeUtils现在有不同的静态方法来转义不同类型的文档()。因此,转义HTML 4.0版字符串: import stat
、“
和&
字符?(即,手动执行以下操作除外)
String source=“小于号(from:
Apache Commons的替代方法:使用的htmlitls.htmlEscape(字符串输入)
方法。出于某些目的:
有较新版本的,它使用不同的包名(org.apache.commons.lang3)。StringEscapeUtils
现在有不同的静态方法来转义不同类型的文档()。因此,转义HTML 4.0版字符串:
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
String output = escapeHtml4("The less than sign (<) and ampersand (&) must be escaped before using them in HTML");
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
String output=escapeHtml4(“小于号(请小心。HTML文档中有许多不同的‘上下文’:在元素内部、带引号的属性值、不带引号的属性值、URL属性、javascript、CSS等……您需要为每一个元素使用不同的编码方法,以防止跨站点脚本编写(XSS)。检查每个上下文的详细信息。您可以在OWASP ESAPI库中找到每个上下文的转义方法--。在android(API 16或更高版本)上,您可以:
或对于较低的API:
TextUtils.htmlEncode(textToScape);
虽然@dfa answer oforg.apache.commons.lang.StringEscapeUtils.escapeHtml
很好,我过去也使用过它,但它不应该用于转义HTML(或XML)属性,否则空格将被规范化(意味着所有相邻的空格字符都变成一个空格)
我之所以知道这一点,是因为我的库(JATL)中有一些未保留空格的属性的bug,因此我加入了(复制粘贴)
虽然这在过去可能没有那么重要(正确的属性转义),但鉴于HTML5的数据-
属性用法的使用,它越来越引起人们的兴趣。Nice short方法:
public static String escapeHTML(String s) {
StringBuilder out = new StringBuilder(Math.max(16, s.length()));
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c > 127 || c == '"' || c == '\'' || c == '<' || c == '>' || c == '&') {
out.append("&#");
out.append((int) c);
out.append(';');
} else {
out.append(c);
}
}
return out.toString();
}
公共静态字符串escapeHTML(字符串s){
StringBuilder out=新的StringBuilder(Math.max(16,s.length());
对于(int i=0;i127 | | c=''“| | c='\''\'''''''\'| | c='''\''\'''\'.'c=''.'{
out.追加()号;
out.append((int)c);
out.append(“;”);
}否则{
附加(c);
}
}
return out.toString();
}
基于(此处缺少amp)。根据使用Google Guava的用户的说法,if子句中选中的四个字符是128以下的唯一字符:
import com.google.common.html.HtmlEscapers;
[...]
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = HtmlEscapers.htmlEscaper().escape(source);
import com.google.common.html.HtmlEscapers;
[...]
String source=“现在不推荐使用小于号(org.apache.commons.lang3.StringEscapeUtils)。您现在必须使用org.apache.commons.text.StringEscapeUtils
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>${commons.text.version}</version>
</dependency>
org.apache.commons
公共文本
${commons.text.version}
大多数库都提供尽可能多的转义,包括数百个符号和数千个非ASCII字符,这在UTF-8世界中是不需要的
此外,正如Jeff Williams所指出的,没有单一的“转义HTML”选项,而是有多个上下文
假设您从不使用无引号的属性,并记住存在不同的上下文,它编写了我自己的版本:
私有静态最终长正文\u转义=
1L Java 8+解决方案:
publicstaticstringescapehtml(stringstr){
返回str.chars()?
““+c+”;”:String.valueOf((char)c)).collect(collector.joining());
}
返回字符串中字符值的IntStream
。然后我们可以使用mapToObj
对字符代码大于127(非ASCII字符)的字符以及双引号(“
)、单引号(”
)、左尖括号(
)和安培(&
)进行转义.收集器。联接
会将字符串
重新连接在一起
为了更好地处理Unicode字符,可以使用String#codePoints
public static String escapeHTML(String str) {
return str.codePoints().mapToObj(c -> c > 127 || "\"'<>&".indexOf(c) != -1 ?
"&#" + c + ";" : new String(Character.toChars(c)))
.collect(Collectors.joining());
}
publicstaticstringescapehtml(stringstr){
返回str.codePoints().mapToObj(c->c>127 | |“\”&.indexOf(c)!=1?
““+c+”;”:新字符串(Character.toChars(c)))
.collect(收集器.joining());
}
谢谢。我用过它(而不是StringEscapeUtils.escapeHtml()
fromapachecommons
2.6)因为它保留了俄文字符的原样。这很好。这些天来我对Apache stuff有了更广泛的认识。我也使用过它,它也保留了中文字符的原样。它还对撇号进行编码,所以它实际上很有用,不像Apache StringEscapeutilst感谢您指出您希望对输出进行编码的上下文非常重要。术语“encode”也是一个比“escape”更合适的动词。escape意味着某种特殊的破解,而不是“如何为以下内容编码此字符串:XHTML属性/SQL查询参数/PostScript打印字符串/CSV输出字段?”“encode”和“escape”都广泛用于描述此术语“转义”通常用于在语法相关字符之前添加“转义字符”,例如使用反斜杠转义引号字符\“术语”encode“在将字符转换为其他形式时更常用,例如URL编码引号字符%22或HTML实体编码为"或@quot..link now broke要节省一些谷歌搜索,请查找编码器类,而StringEscapeUtils
很好,如果您希望,它不会正确地转义属性的空白避免HTML/XML空白规范化。有关更多详细信息,请参阅我的答案。上面的示例已被破坏。请立即使用escapeHtml4()方法。对于番石榴迷,请参阅
TextUtils.htmlEncode(textToScape);
public static String escapeHTML(String s) {
StringBuilder out = new StringBuilder(Math.max(16, s.length()));
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c > 127 || c == '"' || c == '\'' || c == '<' || c == '>' || c == '&') {
out.append("&#");
out.append((int) c);
out.append(';');
} else {
out.append(c);
}
}
return out.toString();
}
import com.google.common.html.HtmlEscapers;
[...]
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = HtmlEscapers.htmlEscaper().escape(source);
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>${commons.text.version}</version>
</dependency>
public static String escapeHTML(String str) {
return str.codePoints().mapToObj(c -> c > 127 || "\"'<>&".indexOf(c) != -1 ?
"&#" + c + ";" : new String(Character.toChars(c)))
.collect(Collectors.joining());
}