EN
Java - encodeURIComponent() equivalent like in JavaScript
10 points
In this article, we would like to show how to get JavaScript encodeURIComponent()
function equivalent in Java.
Using Java, sometimes it is necessary to encode some data to send inside URL. JavaScript provides well known encodeURIComponent()
function.
To get the same effect in Java it is necessary to do the following code:
xxxxxxxxxx
1
// import java.net.URLEncoder;
2
3
String text = "Hi! How are you? Dangerous characters: ?#&";
4
5
String encodedText = URLEncoder.encode(text, StandardCharsets.UTF_8.name());
6
7
encodedText = encodedText.replaceAll("\\+", "%20");
8
encodedText = encodedText.replaceAll("%21", "!");
9
encodedText = encodedText.replaceAll("%27", "'");
10
encodedText = encodedText.replaceAll("%28", "(");
11
encodedText = encodedText.replaceAll("%29", ")");
12
encodedText = encodedText.replaceAll("%7E", "~");
13
14
System.out.println(encodedText); // Hi!%20How%20are%20you%3F%20Dangerous%20characters%3A%20%3F%23%26
Output:
xxxxxxxxxx
1
Hi!%20How%20are%20you%3F%20Dangerous%20characters%3A%20%3F%23%26
Note: check
decodeURIComponent
function Java equivalent here.
URIEncoder.java
file:
xxxxxxxxxx
1
package com.dirask.examples;
2
3
import java.io.UnsupportedEncodingException;
4
import java.net.URLEncoder;
5
6
public class URIEncoder {
7
8
private static final String CHARSET = StandardCharsets.UTF_8.name();
9
10
private static final String[][] CHARACTERS = {
11
{ "\\+", "%20" },
12
{ "%21", "!" },
13
{ "%27", "'" },
14
{ "%28", "(" },
15
{ "%29", ")" },
16
{ "%7E", "~" }
17
};
18
19
public static String encodeURIComponent(String text) {
20
String result;
21
try {
22
result = URLEncoder.encode(text, CHARSET);
23
} catch (UnsupportedEncodingException e) {
24
throw new RuntimeException(e);
25
}
26
for (String[] entry : CHARACTERS) {
27
result = result.replaceAll(entry[0], entry[1]);
28
}
29
return result;
30
}
31
}
Program.java
file:
xxxxxxxxxx
1
package com.dirask.examples;
2
3
import java.io.UnsupportedEncodingException;
4
5
public class Program {
6
7
public static void main(String[] args) {
8
9
String text = "Hi! How are you? Dangerous characters: ?#&";
10
String encodedText = URIEncoder.encodeURIComponent(text);
11
12
System.out.println(encodedText);
13
}
14
}
Output:
xxxxxxxxxx
1
Hi!%20How%20are%20you%3F%20Dangerous%20characters%3A%20%3F%23%26
Multiple replaceAll()
calls in the above examples require multiple iterations through the encoded string.
In this section, you can find the optimal solution.
xxxxxxxxxx
1
package com.dirask.examples;
2
3
import java.io.UnsupportedEncodingException;
4
import java.net.URLDecoder;
5
import java.net.URLEncoder;
6
import java.nio.charset.StandardCharsets;
7
8
public class URIEncoder {
9
10
private static final String CHARSET = StandardCharsets.UTF_8.name();
11
12
public static String encodeURIComponent(String text) {
13
if (text.isEmpty()) {
14
return "";
15
}
16
String code;
17
try {
18
code = URLEncoder.encode(text, CHARSET);
19
} catch (UnsupportedEncodingException e) {
20
throw new RuntimeException(e);
21
}
22
int textLength = text.length();
23
int codeLength = code.length();
24
StringBuilder builder = new StringBuilder((textLength + codeLength + 1) / 2);
25
for (int i = 0; i < codeLength; ++i) {
26
char entry = code.charAt(i);
27
switch (entry) {
28
case '+':
29
builder.append("%20");
30
break;
31
case '%':
32
if (i > codeLength - 2) {
33
break;
34
}
35
char a = code.charAt(i += 1);
36
char b = code.charAt(i += 1);
37
switch (a) {
38
case '2':
39
switch (b) {
40
case '1':
41
builder.append("!");
42
break;
43
case '7':
44
builder.append("'");
45
break;
46
case '8':
47
builder.append("(");
48
break;
49
case '9':
50
builder.append(")");
51
break;
52
default:
53
builder.append("%");
54
builder.append(a);
55
builder.append(b);
56
break;
57
}
58
break;
59
case '7':
60
if (b == 'e' || b == 'E') {
61
builder.append("~");
62
} else {
63
builder.append("%");
64
builder.append(a);
65
builder.append(b);
66
}
67
break;
68
default:
69
builder.append("%");
70
builder.append(a);
71
builder.append(b);
72
break;
73
}
74
break;
75
default:
76
builder.append(entry);
77
break;
78
}
79
}
80
return builder.toString();
81
}
82
}