import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
public class URLDecoder {
/**
* 解码URL串
*
* @param url
* 待解码的URL串
* @return 解码后的字符串
*/
public static String decode(String url) {
char[] chars = url.toCharArray();
int cursor = 0;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = null;
try {
dos = new DataOutputStream(baos);
while (cursor < chars.length) {
int curr = chars[cursor++];
if (curr == '%') {
StringBuffer tmp = new StringBuffer();
char cr = chars[cursor++];
char lf = chars[cursor++];
tmp.append(cr).append(lf);
Integer result = Integer.valueOf(tmp.toString(), 16);
curr = result.intValue();
}
dos.writeByte(curr);
}
dos.flush();
baos.flush();
byte[] data = baos.toByteArray();
String text = URLDecoder.decode(data, 0, data.length);
return text;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dos != null)
dos.close();
if (baos != null)
baos.close();
} catch (Exception e) {
}
}
return null;
}
public static String decode(byte in[], int offset, int length) {
StringBuffer buff = new StringBuffer();
int max = offset + length;
for (int i = offset; i < max; i++) {
char c = 0;
if ((in[i] & 0x80) == 0) {
c = (char) in[i];
} else if ((in[i] & 0xe0) == 0xc0) {// 11100000
c |= ((in[i++] & 0x1f) << 6); // 00011111
c |= ((in[i] & 0x3f) << 0); // 00111111
} else if ((in[i] & 0xf0) == 0xe0) {// 11110000
c |= ((in[i++] & 0x0f) << 12); // 00001111
c |= ((in[i++] & 0x3f) << 6); // 00111111
c |= ((in[i] & 0x3f) << 0); // 00111111
} else if ((in[i] & 0xf8) == 0xf0) {// 11111000
c |= ((in[i++] & 0x07) << 18); // 00000111 (move 18, not
// 16?)
c |= ((in[i++] & 0x3f) << 12); // 00111111
c |= ((in[i++] & 0x3f) << 6); // 00111111
c |= ((in[i] & 0x3f) << 0); // 00111111
} else {
c = '?';
}
buff.append(c);
}
return buff.toString();
}
}
URLDecoder 编码的实现
最新推荐文章于 2022-10-25 18:00:00 发布
本文介绍了一个使用Java实现的URL解码器。该解码器通过解析百分号编码的字符来还原原始的URL字符串。文章详细展示了如何处理特殊编码,并提供了一种将字节转换为字符的方法。
2870

被折叠的 条评论
为什么被折叠?



