思路就是 把字符串按照不同分隔符分开
遇到包含的可能特殊字符,用Stack这个存储结构做个中转,为得是过滤掉哪些特殊字符
用java提供的URLDecode函数,做最后解析
未完待续:
package web.transfer;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector;
/**
* the original goal of this program:parsing URL address,resolving parts encoding in URL form,and transferring them to Chinese
* this is v2.0 of Url2Unicode.java,since i use stacks to resolve the first problem mentioned in Url2Unicode.java
* progress:can parse %E6%B1%87%E7%8E%87&
* %E7%BE%8E%E5++%E6%AC%A7%E5%85%83BA%E6%B0%91_%E5%B8%81
* can not parse %3A110666
*
*
* IMPROVEMENT:using LinkedList to replace Stack,since the single direction of data to push or pop in Stack,
* i have to use two stacks to get the order of encoding part is right.
* If you use LinkedList,only one LinkedList will be needed to initialize.
*
*/
public class Url2UnicodeWithStack {
public String StacksToOrderString(Stack<Character> source) {
Stack<Character> temp = new Stack<Character>();
while ( !source.empty()) {
temp.push(source.pop());
}
String order = new String();
while(!temp.empty()) {
order = order.concat(temp.pop().toString());
//System.out.println("order "+order);
}
return order;
}
public String CheckHeadStartPercent(String input) {
System.out.println("CheckHeadStartPercent method: "+input);
if(!input.startsWith("%")) {
System.out.println("After CheckHeadStartPercent method: "+ input.substring(input.indexOf("%"),input.length()-1));
return input.substring(input.indexOf("%"),input.length()-1);
}
else {
return input;
}
}
public String[] Vector2String(Vector<String> v) {
int length= v.size();
String [] re = new String[length];
Iterator<String> it =(Iterator<String>)v.iterator();
int i = 0;
while(it.hasNext()) {
re[i] = it.next();
++i;
}
return re;
}
public Vector<String> containPercent (String [] input) {
Vector<String> results = new Vector();
int length = input.length;
for(int i = 0;i < length;i++) {
if( input[i].contains("%") ) {
//System.out.println("containPercent method: "+input[i]);
results.add(input[i]);
}
}
/*System.out.println("containPercent method~~Iterator");
Iterator<String> itr = (Iterator<String>)results.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}*/
return results;
}
public String[] containSpecialCharWithStack(String input) {
System.out.println("Enter containSpecialChar method: ");
char [] sp = {'_','-','+','!','`','~','#','@','$','^','*','(',')','{','}','[',']','|',':','\\',';','"','<','>','?',','};
//String [] sp = {"_","-","\\+","!","`","~","#","@","$","\\^","\\*","(",")","{","}","[","]","|",":","\\",";","\"","<",">","?",","};
Vector<String> results = new Vector();
int length = input.length();
Stack<Character> stk = new Stack<Character>();
for(int i = 0;i < length;i++) {
stk.push(input.charAt(i));
for(int j = 0; j < sp.length;++j) {
if(Character.compare(input.charAt(i),sp[j]) == 0) {
stk.pop();
//System.out.println("Enter containSpecialChar method: if(compare char) "+i+" "+j);
String order = StacksToOrderString(stk);
results.add(order);
/*System.out.println("Enter containSpecialChar method: if(compare char) iterator: ");
Iterator<String> itr = (Iterator<String>)results.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
} */
}
}
//System.out.println("Enter containSpecialChar method: first for loop: "+i+" results size() "+results.size());
}
results.add(StacksToOrderString(stk));
System.out.println("Enter containSpecialChar method: if(compare char) iterator: ");
Iterator<String> itr = (Iterator<String>)results.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
return Vector2String(results);
}
public void test() {
String input =
"http://wzdig.pbc.gov.cn:8080/dig/ui/search.action?ty=&w=false&f=&dr=true&p=2&sr=score+desc%2Cdatetime+desc&rp=&advtime=&advrange=&fq=&ext=&q=%E4%B8%AD%E5%9B%BD%E5%A4%96%E6%B1%87%E4%BA%A4%E6%98%93%E4%B8%AD%E5%BF%83%E5%8F%97%E6%9D%83%E5%85%AC%E5%B8%83%E4%BA%BA%E6%B0%91%E5%B8%81%E6%B1%87%E7%8E%87%E4%B8%AD%E9%97%B4%E4%BB%B7";
Vector<String> UrlWords = new Vector();
String [] UrlWordsPre = input.split("=");
/*for(String in:UrlWordsPre) {
System.out.println(in);
}
System.out.println("Start while method:");*/
int i = 1;
while( i < UrlWordsPre.length ) {
String [] temp = UrlWordsPre[i].split("&");
/*for(String in:temp) {
System.out.println(in);
}*/
if ( temp[0].contains("%")) {
System.out.println(i+"---------"+temp[0]);
String[] re = containSpecialCharWithStack(CheckHeadStartPercent(temp[0]));
for(int j =0; j < re.length; j++) {
try {
UrlWords.add(URLDecoder.decode(re[j],"utf-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
++i;
}
System.out.println("Start iterator ZZZZZZZZZZZZZZ:");
Iterator<String> itr = (Iterator<String>)UrlWords.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
}
/*public static void main(String [] args) {
Url2UnicodeWithStack test = new Url2UnicodeWithStack();
test.test();
}*/
}