Java 如何在Groovy中转义特殊字符(unicode除外)

Java 如何在Groovy中转义特殊字符(unicode除外),java,unicode,groovy,escaping,Java,Unicode,Groovy,Escaping,我希望转义字符串中除unicode字符(\u)以外的所有特殊字符,因为我仍然希望正确显示非英语字符。我目前正在使用StringEscapeUtils.escapeJava()方法,但没有找到排除特定字符的方法(\u表示unicode,在本例中)。我能想到的唯一替代方法是为每个特殊字符调用replace或replaceAll,但\u除外,这似乎并不理想。有更好的方法吗 例: 应转换为“Los\nniños”,而不是“Los\nni\u00F1os”好的,因此如果我们查看StringEscapeUt

我希望转义字符串中除unicode字符(\u)以外的所有特殊字符,因为我仍然希望正确显示非英语字符。我目前正在使用StringEscapeUtils.escapeJava()方法,但没有找到排除特定字符的方法(\u表示unicode,在本例中)。我能想到的唯一替代方法是为每个特殊字符调用replace或replaceAll,但\u除外,这似乎并不理想。有更好的方法吗

例:


应转换为
“Los\nniños”
,而不是
“Los\nni\u00F1os”
好的,因此如果我们查看
StringEscapeUtils的代码,我们可以看到:

它使用
ESCAPE\u JAVA

所以,我认为这是最后一点,这是给你不希望的逃跑

所以我们可以推出我们自己的。。。给定您的输入字符串:

def input = '''Los 
niños'''
我们可以导入这些类,并创建我们自己的
LookupTranslator
(从commons lang中删除第一位):

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

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

我不明白。。。为什么不选择合适的编码呢?@tim_yates我使用的框架默认为UTF-8。如果可能的话,我更愿意坚持这样做,但是你有没有一个适合这种情况的编码建议?谢谢你能更好地解释一下为什么要进行这种编码吗?@tim_yates使用UTF-8 b/c这是我们框架的其余部分所使用的,它正确地编码了非拉丁字符,但只要新的编码也正确地编码了非拉丁字符,就很容易改变。以这种方式格式化输出字符串,因为我正在将数据发送给希望以这种形式输入的第三方;它们解析/显示我们发送给它们的数据。是的,但是为什么要通过
StringEscapeUtils.escapeJava
def input = '''Los 
niños'''
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'
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))