【问题标题】:Not able to save HTML Entity in Java String - illegal character无法在 Java 字符串中保存 HTML 实体 - 非法字符
【发布时间】:2020-12-23 14:19:25
【问题描述】:

我无法编译:

String[][] UMLAUT_REPLACEMENTS = {{"\u0022", """},{"\u0021", "!"}};

我尝试使用 \\ 转义特殊字符,但没有效果。

这是错误代码:

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project opk-application-util: Compilation failure: Compilation failure: 
[ERROR] /C:/eplatform/git-repos/opk-backend/opk-application-util/src/main/java/util/SonderZeichenFilter.java:[50,41] '}' expected
[ERROR] /C:/eplatform/git-repos/opk-backend/opk-application-util/src/main/java/ch/opk/util/SonderZeichenFilter.java:[50,45] ';' expected
[ERROR] /C:/eplatform/git-repos/opk-backend/opk-application-util/src/main/java/ch/opk/util/SonderZeichenFilter.java:[50,46] illegal character: '#'
[ERROR] /C:/eplatform/git-repos/opk-backend/opk-application-util/src/main/java/ch/opk/util/SonderZeichenFilter.java:[50,47] ';' expected
[ERROR] /C:/eplatform/git-repos/opk-backend/opk-application-util/src/main/java/opk/util/SonderZeichenFilter.java:[50,50] unclosed string literal

【问题讨论】:

  • 我想没有必要逃避 & 字符
  • 是的 - 这是一个编辑错误。它以这种方式失败:String[][] UMLAUT_REPLACEMENTS = {{"\u0022", """},{"\u0021", "!"}};

标签: java html html-entities


【解决方案1】:

在 Java 中,Unicode 转义序列 (\u<i>XXXX</i>) 作为 pre-processing 的一部分在处理字符串文字 escape sequences 之前处理。因此,当编译器处理"\u0022" 时,它实际上是在处理字符串文字""",它是一个空字符串文字(两个双引号),后跟另一个字符串文字的开引号,因此导致错误“未关闭的字符串文字”,因为有是代码中的双引号数量不均。

这是导致 Javadoc 格式错误的一个常见原因(当作者想直接写 \u<i>XXXX</i> 但生成的 HTML 却包含相应的 Unicode 字符)并且大多数 IDE 也对此感到困惑(例如 \u0063lass MyClass {} 是有效的Java 源代码;\u0063 = c)。

在您的情况下,您可以使用特殊的转义序列\" 来编写文字"。这也将提高可读性,因为不是每个人都熟悉 " 的 Unicode 代码点。类似地,\u0021 可以写成!,因为该字符在 Java 字符串中没有特殊含义。因此,您的代码可以这样编写:

String[][] UMLAUT_REPLACEMENTS = {{"\"", "&#34;"},{"!", "&#33;"}};

如果您想在 Java 字符串中使用文字 \u<i>XXXX</i>,则必须通过在其前面加上另一个 \ 来转义反斜杠:"\\u<i>XXXX</i>"

【讨论】:

  • 嗨!抱歉,出于编辑原因,我在此处放置了反斜杠-我实际上完全使用了此代码序列,并且在上面收到了此错误: `` String[][] UMLAUT_REPLACEMENTS = {{"\u0022", """},{" \u0021", "!"}};``
  • @FrancescoRovetto,感谢您的澄清。我误解了你的问题,现在已经相应地更新了我的答案。
  • 非常感谢!! \\uXXXX 将删除错误,但 Java 不再以某种方式将其识别为 unicode。但是我们已经接近解决方案了 :-) 不幸的是,我们不能使用空白符号! "等。我正在寻找一种能够在字符串数组中使用 unicode 的方法...
  • @FrancescoRovetto 那么您能否更详细地描述一下期望的结果?请注意,例如"\u0021""!" 在编译类中和运行时完全相同,所以如果你只想创建一个包含"!" 的字符串,那么就不需要使用unicode 转义。如果您希望 \u0021 成为字符串的文字值,那么您需要对其进行转义。试试看,例如使用System.out.println("\\u0021");
  • 是的,实际上只有 Java 使用的字符存在问题。然后,例如 \u0022 会引发错误。但我现在找到了一个解决方案,我将在答案中提出。 :-)
【解决方案2】:

问题似乎是"\u0022" 字符串,因为java 编译器在有时会导致错误的代码解析之前将转义序列转换为UTF。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.6

Compile time error while adding unicode \u0022

所以,"\u0022" 必须替换为 "\""

【讨论】:

    【解决方案3】:

    我找到了解决办法!

    所以,String[][] UMLAUT_REPLACEMENTS = {{"\u0022", "&amp;#34;"},{"\u0021", "&amp;#33;"}}; 不起作用的原因是,因为 \u0022 在编译时已经被解释为 ",这会引发错误,因为 """ 需要转义。

    但是如果转义\u0022,就不会再被识别为字符了。

    还有一个解决方案,我应用了。


    顺便说一句,这个解决方案是屏蔽所有拉丁 ascii 字母的特殊字符,除了非常简单的字符。

    首先,声明一个字符串数组:

        public String escapeHtml(String input) {
    
        String escapedHtml = input;
    
    String[][] UMLAUT_REPLACEMENTS =
                {
                        {"\\u0021", "&33"},
                        {"\\u0022", "&#34"},
                        {"\\u0024", "&#36"},
                        {"\\u0025", "&#37"},
                        {"\\u0026", "&#38"},
                        {"\\u0027", "&#39"},
                        {"\\u0028", "&#40"},
    };
    

    然后,您查找字符以将它们替换为 HTML 实体,但使用 StringEscapeUtils.unescapeJava(INPUT) 取消转义 \uXXXX

        for (int i = 0; i < UMLAUT_REPLACEMENTS.length; i++) {
            String unescapedSign = StringEscapeUtils.unescapeJava(UMLAUT_REPLACEMENTS[i][0]);
            escapedHtml = escapedHtml.replace(unescapedSign, UMLAUT_REPLACEMENTS[i][1]);
        }
    
    
        return escapedHtml;
    
    
    Thank you for your help!!
    

    【讨论】:

    • 您是否测试过其他答案是否不适合您?因为你正在做的是"\\u0021" -StringEscapeUtils.unescapeJava(...)-> "!" -> replace。当您首先可以只写 "!" 而省略 unescapeJava 时,这似乎不必要地使事情复杂化(除非有其他代码使用 UMLAUT_REPLACEMENTS,此处未显示)。
    • 是的,只要源仅部署在本地,它就可以工作。 unicode 更节省 - 如果编码发生某种变化,所有字符都消失了。
    • !" 都是 ASCII 字符,所以我怀疑是否有任何(常用的)编码会弄乱它们。请注意,在 Java 中字符串始终是 UTF-16,因此除非您谈论影响完整源代码(而不仅仅是字符串文字)的编码问题,否则应该不会有任何问题。
    猜你喜欢
    • 2016-02-23
    • 2013-02-07
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多