2017-01-09 55 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范围之外使用了一些字符,你会在某些时候出现一些有趣的问题。变量名称或字符串文字。 –