StringEscapeUtils escapeJava正在逃避英镑标志

时间:2017-01-09 13:45:21

标签: java apache-commons

我试图转义字符串以确保转义特殊字符。

使用

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

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

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

我可以理解,emojis包含反斜杠,因此被转义,但为什么英镑符号被转义,我该如何阻止它被转义?

1 个答案:

答案 0 :(得分:3)

StringEscapeUtils.escapeJava()的文档对“Java String规则”到底是什么含糊不清。

我想它指的是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替换字符串中的£