Java doesn’t have any native method for escaping a String
and after investigating existing methods, I decided to write my own. I posted the solution to Stack Overflow.
I was writing some JSON to a file, but the String
s themselves contained escape characters (or theoretically could), i.e.:
0001 { 0002 "key" : ""value"" 0003 }
Ideally you would want to escape the speech marks ("
) if you wanted the structure to be parsed correctly by JSON, i.e.:
0004 { 0005 "key" : "\"value\"" 0006 }
But actually this problem occurs in other places too, this isn’t even the first time I had to solve something similar. When parsing comments for example to be displayed in HTML, you don’t want users injecting <script>
tags for example that may run malicious JavaScript on the machines of other users. (P.S. Any HTML parsed should be considered harmful, it’s a lot safer to filter out all HTML and add it back in later than to try and only allow select HTML through.)
Many of the solutions suggest adding the Apache Commons Text and using StringEscapeUtils. Some of the other solutions were simply wrong.
The solution I created:
0007 /** 0008 * escape() 0009 * 0010 * Escape a give String to make it safe to be printed or stored. 0011 * 0012 * @param s The input String. 0013 * @return The output String. 0014 **/ 0015 public static String escape(String s){ 0016 return s.replace("\\", "\\\\") 0017 .replace("\t", "\\t") 0018 .replace("\b", "\\b") 0019 .replace("\n", "\\n") 0020 .replace("\r", "\\r") 0021 .replace("\f", "\\f") 0022 .replace("\'", "\\'") 0023 .replace("\"", "\\\""); 0024 }
The escape list is from Oracle’s list. (Note that \\
is escaped first as you don’t want to re-escape it later.)
This solution isn’t as fast as it could be, but it should work. Ideally you would only parse the String
once and you wouldn’t need to keep rebuilding your String
array. For small String
s this should be fine. This solution was more than fine for me as the String
s I escaped were less than 64 characters, theoretically a maximum of 836 even in the worst case scenario. If escaping larger String
s, you can do much better.
If you’re thinking about this from the perspective of storing data, also consider something like converting it to Base64 representation - it’s fast, single parse and uses not too much extra space.