解析URL编码格式到中文(直接从完整的URL地址入手)V2.0

该程序旨在解析URL地址,解决URL编码部分,并将其转换为中文。通过使用Stack作为存储结构,过滤特殊字符,再利用Java的URLDecoder函数进行最终解析。目前能解析部分编码,如'%E6%B1%87%E7%8E%87&%E7%BE%8E%E5++%E6%AC%A7%E5%85%83BA%E6%B0%91_%E5%B8%81',但无法解析'%3A110666'。升级版使用LinkedList替换Stack,以简化数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路就是 把字符串按照不同分隔符分开

                遇到包含的可能特殊字符,用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();
        }*/
        
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值