除了unicode字符(\ u)之外,我想要转义字符串中的所有特殊字符,因为我仍然希望正确显示非英文字符。我目前正在使用StringEscapeUtils.escapeJava()方法,但还没有找到排除特定字符的方法(在本例中为\ u for unicode)。我能想到的唯一选择是为除了\ u之外的每个特殊字符调用replace或replaceAll,这看起来并不理想。有更好的方法吗?
例如:
"Los
niños"
应转换为"Los\nniños"
而不是"Los\nni\u00F1os"
答案 0 :(得分:0)
好的,如果我们查看StringEscapeUtils
的代码,我们就可以看到escapeJava
method here:
public static final String escapeJava(final String input) {
return ESCAPE_JAVA.translate(input);
}
使用ESCAPE_JAVA
which is defined here
public static final CharSequenceTranslator ESCAPE_JAVA =
new LookupTranslator(
new String[][] {
{"\"", "\\\""},
{"\\", "\\\\"},
}).with(
new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE())
).with(
JavaUnicodeEscaper.outsideOf(32, 0x7f)
);
所以,我认为这是最后一点让你不必要的逃避......
所以我们可以自己动手......给出你的输入字符串:
def input = '''Los
niños'''
我们可以导入这些类,并创建我们自己的LookupTranslator
(从commons-lang中删除第一位):
import org.apache.commons.lang3.text.translate.EntityArrays
import org.apache.commons.lang3.text.translate.LookupTranslator
def translator = new LookupTranslator([["\"", "\\\""], ["\\", "\\\\"]] as String[][]).with(
new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE())
)
然后,我们可以转义您的输入String,并检查结果是否符合预期:
assert translator.translate(input) == 'Los \\nniños'
如果您需要转义为低于32的unicode字符(但显然不是更高的代码字符),您可以将您的译员更改为:
import org.apache.commons.lang3.text.translate.EntityArrays
import org.apache.commons.lang3.text.translate.JavaUnicodeEscaper
import org.apache.commons.lang3.text.translate.LookupTranslator
def translator = new LookupTranslator([["\"", "\\\""], ["\\", "\\\\"]] as String[][]).with(
new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE())
).with(JavaUnicodeEscaper.below(32))
所有这些都来自commons-lang3,我认为这是你正在使用的版本......