如何在Groovy中转义特殊字符,不包括unicode

时间:2016-03-28 23:02:33

标签: java unicode groovy escaping

除了unicode字符(\ u)之外,我想要转义字符串中的所有特殊字符,因为我仍然希望正确显示非英文字符。我目前正在使用StringEscapeUtils.escapeJava()方法,但还没有找到排除特定字符的方法(在本例中为\ u for unicode)。我能想到的唯一选择是为除了\ u之外的每个特殊字符调用replace或replaceAll,这看起来并不理想。有更好的方法吗?

例如:

"Los 
niños"

应转换为"Los\nniños"而不是"Los\nni\u00F1os"

1 个答案:

答案 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,我认为这是你正在使用的版本......