问题描述
我不能编译它:
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","""},{"\\u0024","$"},{"\\u0025","%"},{"\\u0026","&"},{"\\u0027","'"},{"\\u0028","("},};
然后,您寻找字符以将它们替换为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!!