非法字符

ryevplcw  于 2021-07-05  发布在  Java
关注(0)|答案(3)|浏览(597)

我无法编译: 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
hfwmuf9z

hfwmuf9z1#

在java unicode转义序列中( \uXXXX )在处理字符串文字转义序列之前,作为预处理的一部分进行处理。因此当编译器处理 "\u0022" 它实际上是在处理字符串文本 """ 它是一个空字符串文字(两个双引号),后跟另一个字符串文字的开头引号,因此会导致错误“unclosed string literal”,因为代码中的双引号数量不均匀。
这是javadoc格式错误的一个常见原因(当作者想按字面意思编写时) \uXXXX 但是最终的html却包含相应的unicode字符),而且大多数IDE也会对此感到困惑(例如。 \u0063lass MyClass {} 是有效的java源代码; \u0063 = c ).
在你的情况下,你可以使用特殊的转义序列 \" 写文字 " . 这也将提高可读性,因为不是每个人都熟悉unicode代码点 " . 同样地 \u0021 可以写成 ! 因为这个字符在java字符串中没有特殊意义。因此,您的代码可以这样编写:

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

如果你想要文字 \uXXXX 在java字符串中,必须在反斜杠前面加上另一个反斜杠来对其进行转义 \ : "\\uXXXX"

czq61nw1

czq61nw12#

我找到解决办法了!
所以,原因,为什么 String[][] UMLAUT_REPLACEMENTS = {{"\u0022", """},{"\u0021", "!"}}; 不起作用,是因为\u0022已被解释为“while compiling,while compiling,while抛出错误,因为“”需要转义。
但是如果您转义\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(输入)来替换unescape\u

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

2ekbmq323#

似乎问题是 "\u0022" 字符串,因为java编译器在代码解析之前将转义序列转换为utf,有时会导致错误。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.6
添加unicode时出现编译时错误\u0022
所以, "\u0022" 必须替换为 "\""

相关问题