2017-01-09 16 views
1

特殊文字がエスケープされるように文字列をエスケープしようとしています。StringEscapeUtils escapeJavaがシャープ記号をエスケープしています

StringEscapeUtils.escapeJava("") escapes to \\uD83D\\uDE00 

StringEscapeUtils.escapeJava("% ! @ $^& * ") doesn't escape any of the characters 

StringEscapeUtils.escapeJava("£") escapes to \\u00A3 

を使用して

私は絵文字がバックスラッシュが含まれているので、エスケープされているが、なぜシャープ記号がエスケープされている、と私はエスケープされているからそれをどのように停止しないことを理解することができますか?

+1

Commonsのutilsは使用しませんでしたが、 'StringEscapeUtils.escapeJava()'のJavaDocsを読むことをお勧めします。 – Sufian

+0

@Sufian [ドキュメント](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringEscapeUtils.html#escapeJava-java.lang.String-)ではポンド記号を挙げる。なぜこれが下落したのかわからない - これは完全に有効な質問だと思う。 – cubrr

+1

文書によると: 'Java String rules'を使用して文字列内の文字をエスケープします。だから、Sufianは正しいです – Valijon

答えて

2

StringEscapeUtils.escapeJava()のドキュメントは、「Java文字列ルール」とまったく同じです。

私はそれが言うところ、JLS Chapter 3にビットを参照している推測:§(ユニコードエスケープするように(§3.2)

プログラムがUnicode(§3.1)で書かれているが、字句翻訳が提供されています3.3)を使用して、ASCII文字のみを使用して任意のUnicode文字を含めることができます。

ASCII(ANSIのX3.4)

は、情報交換用米国標準コードです。 Unicode UTF-16エンコーディングの最初の128文字はASCII文字です。

だから、それはASCII文字のみを使って書くことができるように文字列をエスケープ 意味するかもしれません。

%!@$^&*は、すべてのASCII文字です。それらは128未満の値を有する(すなわち、それらは7ビットブロックにある)。

£は、ASCII文字ではありません。ISO8859-1では、7ビットASCIIブロックの外にある163(0xA3)としてエンコードされています。

文字列リテラルに£のファイルを開くと、文字エンコーディングが正しく設定されていないエディタであれば、レンダリングされる可能性があります。たとえば、ISO8859-2で解釈される場合はŁとなります。

したがって、シャープ記号は曖昧ではないためにエスケープされます。

私はこの方法を使用して、あなたがすることはできません

をエスケープされているからそれをどのように停止します。代替案を見つける必要があります。あなたができる唯一のことは、文字列の\u00A7£にもう一度置き換えることです。

+1

JavaソースファイルはUTF-8でエンコードされているとは限りません。ほとんどのプラットフォームとeclipseなどのIDEでは、プラットフォームのデフォルトがどのようなものでもエンコードされます。たとえばos xではUTF-8ではありません。良い方法は、UTF-8をIDEとビルドファイルのデフォルトとして強制することです。だから、脱出は正しいことをしていることを考えると、もしあなたがこれをやっていないのであれば、誰かがアスキー範囲外のいくつかの文字を例えば、変数名または文字列リテラル。 –

関連する問題