【问题标题】:Java how to encode single quote and double quote into HTML entities?Java如何将单引号和双引号编码为HTML实体?
【发布时间】:2015-06-03 12:46:31
【问题描述】:

如何将" 编码为" 并将' 编码为'

我很惊讶 HTML Entities 4.0 中没有定义单引号和双引号,因此 StringEscapeUtils 无法将这两个字符转义到相应的实体中。

还有其他与字符串相关的工具可以做到这一点吗?

HTML Entities 4.0 中没有定义单引号和双引号的任何原因?

除了单引号和双引号之外,是否有任何框架能够将所有 unicode 字符编码为相应的实体?既然所有的 unicode 都可以手动翻译成十进制实体并显示在 HTML 中,请问有没有什么工具可以自动转换呢?

【问题讨论】:

    标签: java html


    【解决方案1】:
    1. 单引号和双引号未在 HTML 4.0 中定义

    单引号在HTML 4.0中没有定义,双引号定义为"开始HTML2.0

    1. StringEscapeUtils 无法将这 2 个字符转义到各自的实体中

    escapeXml11 in StringEscapeUtils supports 将单引号转换为'

    例如:

    StringEscapeUtils.escapeXml11("'"); //Returns '
    StringEscapeUtils.escapeHtml4("\""); //Returns "
    
    1. 还有其他与字符串相关的工具可以做到这一点吗?

    来自 Spring 框架的HTMLUtils 处理单引号和双引号,它还将值转换为十进制(如'")。 以下示例取自question的答案:

    import org.springframework.web.util.HtmlUtils;
    [...]
    HtmlUtils.htmlEscapeDecimal("&")` //gives &
    HtmlUtils.htmlEscape("&")` //gives &
    
    1. HTML Entities 4.0 中没有定义单引号和双引号的任何原因?

    根据Character entity references in HTML 4,未定义单引号。双引号可从 HTML2.0 获得。而XHTML1.0 支持单引号。

    1. 将所有 unicode 字符编码为相应实体的工具或方法

    作为对question 的回答的一部分,提到了一个非常好的和简单的 java 实现。

    以下是基于该答案的示例程序:

    import org.apache.commons.lang3.StringEscapeUtils;
    
    public class HTMLCharacterEscaper {
        public static void main(String[] args) {        
            //With StringEscapeUtils
            System.out.println("Using SEU: " + StringEscapeUtils.escapeHtml4("\" ¶"));
            System.out.println("Using SEU: " + StringEscapeUtils.escapeXml11("'"));
    
            //Single quote & double quote
            System.out.println(escapeHTML("It's good"));
            System.out.println(escapeHTML("\" Grit \""));
    
            //Unicode characters
            System.out.println(escapeHTML("This is copyright symbol ©"));
            System.out.println(escapeHTML("Paragraph symbol ¶"));
            System.out.println(escapeHTML("This is pound £"));      
        }
    
        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();
        }
    
    }
    

    以下是一些有趣的链接,是我在寻找答案的过程中遇到的:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2018-11-18
      • 2022-01-05
      • 1970-01-01
      • 2017-12-29
      • 2013-05-26
      • 2015-12-18
      相关资源
      最近更新 更多