无法以Java字符串保存HTML实体-非法字符

问题描述

我不能编译它:

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

解决方法

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

这是格式错误的Javadoc的某种常见原因(当作者想按字面意义编写\uXXXX时,结果HTML却包含相应的Unicode字符),并且大多数IDE对此也感到困惑(例如{{1 }}是有效的Java源代码; \u0063lass MyClass {} = \u0063)。

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

!

如果要在Java字符串中使用文字String[][] UMLAUT_REPLACEMENTS = {{"\"","""},{"!","!"}}; ,则必须在反斜杠前加上另一个\uXXXX\

,

问题似乎是"\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"必须替换为"\""

,

我找到了解决方法!

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

但是如果您转义\ u0022,它将不再被识别为字符。

但是我也有一个解决方案。


顺便说一句,此解决方案是掩盖拉丁字母ascii的所有特殊字符,但非常简单的字符除外。

首先,您声明一个String数组:

    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!!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...