Java中頁面重定向亂碼終極解決方案-----java, weblogic, websphere, aix,unix,linux,windows,中英文等任何語言
1
import java.io.ByteArrayOutputStream;
2
import javax.servlet.http.HttpServletRequest;
3
4
public class URLDecoder {
5
6
/**
7
* 前言:
8
* 多年java開發,在各服務器,中間件以及各異的字符集環境中,深受頁面重定向編碼亂碼之苦,終于痛下決心解決這個問題。
9
* 思路:
10
* 在重定向前 將 &a=b 的名值對編碼為 16進制
11
* 在request.getparameter("")時將 重定向前的已經編碼的字符串進行解碼
12
*
13
* Java中頁面重定向亂碼終極解決方案-----java, weblogic, websphere, aix,unix,linux,windows,中英文等任何語言
14
*/
15
16
/**
17
* 16進制數字字符集
18
*/
19
private static String hexString = "0123456789ABCDEF ";
20
public final static String NothingStr = "";
21
public final static String NullStr = "null#NULL#Null";
22
23
24
25
26
/**
27
* 用于頁面的名值對取值方法
28
*/
29
public static String getParameter(HttpServletRequest request, String parameter) {
30
if (isNull(parameter)) {
31
return "";
32
}
33
String value = "";
34
// 先編碼查詢串
35
String params = enCodeHex(parameter);
36
// 取出對應的值
37
value = (String) request.getParameter(params);
38
// 解碼值
39
value = deCodeHex(value);
40
return value;
41
}
42
43
44
/**
45
* 編碼QueryString
46
* @param str
47
* @return
48
*/
49
public static String encodeQueryString(String params) {
50
if (isNull(params)) {
51
return "";
52
}
53
StringBuffer hexStrBuffer = new StringBuffer();
54
if (params.startsWith("?")) {
55
// ?開頭的queryString先處理?
56
hexStrBuffer.append("?");
57
String firstStr = params.substring(params.indexOf("?") + 1, params.indexOf("&"));
58
String strIn[] = firstStr.split("=");
59
if (strIn.length == 2) {
60
hexStrBuffer.append(enCodeHex(strIn[0]));
61
hexStrBuffer.append("=");
62
hexStrBuffer.append(enCodeHex(strIn[1]));
63
}
64
params = params.substring(params.indexOf("&"));
65
}
66
String strOut[] = params.split("&");
67
boolean bool = false;
68
for (int i = 0; i < strOut.length; i++) {
69
String strIn[] = strOut[i].split("=");
70
if (strIn.length == 2) {
71
if (params.startsWith("&")) {
72
bool = true;
73
} else if (!params.startsWith("&") && i > 0) {
74
bool = true;
75
}
76
if (bool) {
77
hexStrBuffer.append("&");
78
}
79
hexStrBuffer.append(enCodeHex(strIn[0]));
80
hexStrBuffer.append("=");
81
hexStrBuffer.append(enCodeHex(strIn[1]));
82
}
83
}
84
return hexStrBuffer.toString();
85
}
86
87
/**
88
* 解碼QueryString
89
* @param params
90
* @return
91
*/
92
public static String deCodeString(String params) {
93
System.out.println("URLDecoder deCodeString: " + params);
94
if (isNull(params)) {
95
return "";
96
}
97
StringBuffer hexStrBuffer = new StringBuffer();
98
// ?開頭的queryString先處理?
99
if (params.startsWith("?")) {
100
hexStrBuffer.append("?");
101
String firstStr = params.substring(params.indexOf("?") + 1, params.indexOf("&"));
102
String strIn[] = firstStr.split("=");
103
if (strIn.length == 2) {
104
hexStrBuffer.append(deCodeHex(strIn[0]));
105
hexStrBuffer.append("=");
106
hexStrBuffer.append(deCodeHex(strIn[1]));
107
}
108
params = params.substring(params.indexOf("&"));
109
}
110
String strOut[] = params.split("&");
111
boolean bool = false;
112
for (int i = 0; i < strOut.length; i++) {
113
String strIn[] = strOut[i].split("=");
114
if (strIn.length == 2) {
115
if (params.startsWith("&")) {
116
bool = true;
117
} else if (!params.startsWith("&") && i > 0) {
118
bool = true;
119
}
120
if (bool) {
121
hexStrBuffer.append("&");
122
}
123
hexStrBuffer.append(deCodeHex(strIn[0]));
124
hexStrBuffer.append("=");
125
hexStrBuffer.append(deCodeHex(strIn[1]));
126
}
127
}
128
return hexStrBuffer.toString();
129
}
130
131
132
/**
133
* 判斷是否是空串
134
*
135
* @param s
136
* @return
137
*/
138
private static boolean isNull(String s) {
139
if (s == null || (NullStr.indexOf(s) > -1 || s.trim().equals(NothingStr))
140
|| "undefined".equals(String.valueOf(s))) {
141
return true;
142
}
143
return false;
144
}
145
146
/*
147
* 將字符串編碼成16進制數字,適用于所有字符(包括中文)
148
*/
149
private static String enCodeHex(String str) {
150
if (isNull(str)) {
151
return "";
152
}
153
// 根據默認編碼獲取字節數組
154
byte[] bytes = str.getBytes();
155
StringBuilder sb = new StringBuilder(bytes.length * 2);
156
// 將字節數組中每個字節拆解成2位16進制整數
157
for (int i = 0; i < bytes.length; i++) {
158
sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
159
sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
160
}
161
return sb.toString();
162
}
163
164
/*
165
* 將16進制數字解碼成字符串,適用于所有字符(包括中文)
166
*/
167
private static String deCodeHex(String bytes) {
168
if (isNull(bytes)) {
169
return "";
170
}
171
ByteArrayOutputStream baos = new ByteArrayOutputStream(bytes.length() / 2);
172
// 將每2位16進制整數組裝成一個字節
173
for (int i = 0; i < bytes.length(); i += 2) {
174
baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString.indexOf(bytes.charAt(i + 1))));
175
}
176
return new String(baos.toByteArray());
177
}
178
}
179

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

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

posted on 2010-05-31 21:23 澤來-王者之劍 閱讀(1460) 評論(0) 編輯 收藏 所屬分類: j2se