javascript和JAVA一樣,一些特殊字符需要轉義
特別是在一些JSP網頁的開發中,好多程序員經常會忘掉這點,
例:
1 <% List textList = (List)request.getAttribute("textList"); %>
2 <script>
3 <!--
4 var txtList = new Array();
5 <% for ( int i = 0 ; i < textList.size() ; i++) { %>
6 txtList[<%=i%>] = "<%=textList.get(i)%>";
7 <% } %>
8 -->
9 </script>
2 <script>
3 <!--
4 var txtList = new Array();
5 <% for ( int i = 0 ; i < textList.size() ; i++) { %>
6 txtList[<%=i%>] = "<%=textList.get(i)%>";
7 <% } %>
8 -->
9 </script>
這段JS就存在問題,未對特殊符號進行處理.有特殊符號的情況下有可能報JSERROR
JAVASCRIPT中需要轉義的有:
轉義序列 | 字符 |
---|---|
\b | 退格 |
\f | 走紙換頁 |
\n | 換行 |
\r | 回車 |
\t | 橫向跳格 (Ctrl-I) |
\' | 單引號 |
\" | 雙引號 |
\\ | 反斜杠 |
此外,對/符號我覺得也有必要進行處理,因為象 --></script> 這樣的字符串也會使SCRIPT出錯.
下面提供一個比較實用java的方法,做這個特殊符號的處理:
1
public class JavaScriptUtils {
2
public static String javaScriptEscape(String input) {
3
if (input == null) {
4
return input;
5
}
6
StringBuffer filtered = new StringBuffer(input.length());
7
char prevChar = '\u0000';
8
char c;
9
for (int i = 0; i < input.length(); i++) {
10
c = input.charAt(i);
11
if (c == '"') {
12
filtered.append("\\\"");
13
}
14
else if (c == '\'') {
15
filtered.append("\\'");
16
}
17
else if (c == '\\') {
18
filtered.append("\\\\");
19
}
20
else if (c == '\t') {
21
filtered.append("\\t");
22
}
23
else if (c == '\n') {
24
if (prevChar != '\r') {
25
filtered.append("\\n");
26
}
27
}
28
else if (c == '\r') {
29
filtered.append("\\n");
30
} else if (c == '\f') {
31
filtered.append("\\f");
32
} else if (c == '/') {
33
filtered.append("\\/");
34
}
35
else {
36
filtered.append(c);
37
}
38
prevChar = c;
39
}
40
return filtered.toString();
41
}
42
}
43

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

上面的例子應改為:
1 <% List textList = (List)request.getAttribute("textList"); %>
2 <script>
3 <!--
4 var txtList = new Array();
5 <% for ( int i = 0 ; i < textList.size() ; i++) { %>
6 txtList[<%=i%>] = "<%=JavaScriptUtils.javaScriptEscape(textList.get(i))%>";
7 <% } %>
8 -->
9 </script>
2 <script>
3 <!--
4 var txtList = new Array();
5 <% for ( int i = 0 ; i < textList.size() ; i++) { %>
6 txtList[<%=i%>] = "<%=JavaScriptUtils.javaScriptEscape(textList.get(i))%>";
7 <% } %>
8 -->
9 </script>