Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在纯Java中转义HTML符号的推荐方法是什么?_Java_Html_Escaping - Fatal编程技术网

在纯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

在以普通Java代码输出HTML时,是否有一种推荐的方法来转义
&
字符?(即,手动执行以下操作除外)

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 of
org.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()
from
apachecommons
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());
}