2017-01-09 47 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字符串規則'轉義字符串中的字符。所以,Sufian是正確的 – Valijon

回答

2

StringEscapeUtils.escapeJava()的文檔在「Java字符串規則」的含義上很模糊。

我想這是指的是位JLS Chapter 3,在那裏說:

程序是用的Unicode(3.1節),但詞彙翻譯提供(§3.2),使Unicode轉義字符(§ 3.3)可以用來包含任何只使用ASCII字符的Unicode字符。

ASCII(ANSI X3.4)是美國標準信息交換碼。 Unicode UTF-16編碼的前128個字符是ASCII字符。

因此,它可能意味着逃避字符串,以便它可以只使用ASCII字符被寫入。

%!@$^&*都是ASCII字符。它們的值小於128(即它們在7位塊中)。

£不是ASCII字符:在ISO8859-1中,它編碼爲163(0xA3),它位於7位ASCII塊之外。

如果在字符串文字中使用£打開文件,如果該編輯器未正確設置字符編碼,則可能會將其渲染爲其他內容。例如,如果在ISO8859-2中解釋它,它可能是Ł

爲了明確,英鎊符號因此逃脫。

如何從被轉義

你不能,用這種方法阻止它;你需要找到一個替代方案。您唯一能做的就是再次用£替換字符串中的\u00A7

+1

Java源文件不保證是UTF-8編碼。在大多數平臺和eclipse等IDE中,它們將被編碼爲任何平臺默認值,例如os x不會是UTF-8。一個好的做法是強制UTF-8作爲您的IDE和構建文件的默認設置。所以,鑑於這種情況,逃避是正確的。如果你沒有這樣做,如果有人在ascii範圍之外使用了一些字符,你會在某些時候出現一些有趣的問題。變量名稱或字符串文字。 –