2016-03-28 28 views
-1

英語以外の文字を正しく表示したいので、ユニコード文字(\ u)を除くすべての特殊文字をエスケープしたいと思います。現在、StringEscapeUtils.escapeJava()メソッドを使用していますが、特定の文字を除外する方法は見つかりませんでした(この例では、Unicodeの場合は\ uです)。私が考えることのできる唯一の選択肢は、\ uを除く各特殊文字に対してreplaceまたはreplaceAllを呼び出すことです。これは理想的ではないようです。これを行うより良い方法はありますか?ユニコードを除く、Groovyの特殊文字をエスケープする方法

例:

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

:我々はStringEscapeUtilsのコードに見れば、私たちはescapeJava method hereを見ることができるように

"Los 
niños" 

は、"Los\nniños"代わりの"Los\nni\u00F1os"

+0

...コモンズ-lang3私はあなたが使用しているバージョンであると仮定しているからだけで適切なエンコードを選択しないで、なぜ私は...理解していませんか? –

+0

@tim_yates私はUTF-8にデフォルトを使用しているフレームワークです。可能であればそれに固執したいと思いますが、このためにはエンコードの推奨がありますか?ありがとう! – snarkblurb

+0

このエンコーディングをなぜ行うのか説明してもらえますか? –

答えて

0

[OK]をに変換する必要がありますどちらが使用されますか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私たち自身を作成することができます。

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)) 

これらのすべてが

+0

ありがとう!これは完全に機能します。 – snarkblurb

関連する問題