【问题标题】:How to escape special characters in Groovy, excluding unicode如何在 Groovy 中转义特殊字符,不包括 unicode
【发布时间】:2016-03-28 23:02:32
【问题描述】:

我想转义字符串中除 unicode 字符 (\u) 之外的所有特殊字符,因为我仍想正确显示非英文字符。我目前正在使用 StringEscapeUtils.escapeJava() 方法,但还没有找到排除特定字符的方法(在这种情况下,\u 表示 unicode)。我能想到的唯一替代方法是为除 \u 之外的每个特殊字符调用 replace 或 replaceAll,这似乎并不理想。有没有更好的方法来做到这一点?

例如:

"Los 
niños"

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

【问题讨论】:

  • 我不明白......为什么不选择合适的编码?
  • @tim_yates 我使用的框架默认为 UTF-8。如果可能的话,我更愿意坚持这一点,但是你有没有推荐的编码适合这个?谢谢!
  • 您能更好地解释一下为什么要进行这种编码吗?
  • @tim_yates 使用 UTF-8 b/c 这是我们框架的其余部分使用的,它正确编码非拉丁字符,但这可以很容易地改变,只要新的编码也编码非拉丁字符正确。以这种方式格式化输出字符串,因为我将数据发送给期望以这种形式输入的第三方;他们解析/显示我们发送给他们的数据。
  • 是的,但你为什么要通过StringEscapeUtils.escapeJava

标签: java unicode groovy escaping


【解决方案1】:

好的,如果我们查看StringEscapeUtils的代码,我们可以看到escapeJava method here

public static final String escapeJava(final String input) {
    return ESCAPE_JAVA.translate(input);
}

其中使用ESCAPE_JAVAwhich 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())
)

然后,我们可以转义您输入的字符串,并检查结果是否符合预期:

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

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2020-01-17
    • 2015-01-02
    相关资源
    最近更新 更多