1. 程式人生 > >java中的URjava中的URLEncoder和URLDecoder類LEncoder和URLDecoder類

java中的URjava中的URLEncoder和URLDecoder類LEncoder和URLDecoder類

下面就是它的輸出。需要注意的是這些程式碼應該以其他編碼形式被儲存而不是以ASCII碼的形式,還有就是你選擇的編碼形式應該作為一個引數傳給編譯器,讓編譯器能據此對原始碼中的非ASCII字元作出正確的解釋。

% javac -encoding UTF8 EncoderTest %

java EncoderTest
This+string+has+spaces
This*string*has*asterisks
This%25string%25has%25percent%25signs
This%2Bstring%2Bhas%2Bpluses
This%2Fstring%2Fhas%2Fslashes
This%22string%22has%22quote%22marks
This%3Astring%3Ahas%3Acolons
This%7Estring%7Ehas%7Etildes
This%28string%29has%28parentheses%29
This.string.has.periods
This%3Dstring%3Dhas%3Dequals%3Dsigns
This%26string%26has%26ampersands
This%C3%A9string%C3%A9has%C3%A9non-ASCII+characters

特別需要注意的是這個方法編碼了符號,“\” ,&,=,和:。它不會嘗試著去規定在一個URL中這些字元怎樣被使用。由此,所以你不得不分塊編碼你的URL,而不是把整個URL一次傳給這個方法。這是很重要的,因為對類URLEncoder最通常的用法就是查詢string,為了和伺服器端使用GET方法的程式進行互動。例如,假設你想編碼這個查詢sting,它用來搜尋AltaVista網站:
pg=q&kl=XX&stype=stext&q=+"Java+I/O"&search.x=38&search.y=3

這段程式碼對其進行編碼:
String query = URLEncoder.encode( "pg=q&kl=XX&stype=stext&q=+\"Java+I/O\"&search.x=38&search.y=3");System.out.println(query);

不幸的是,得到的輸出是:
pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

出現這個問題就是方法URLEncoder.encode( ) 在進行盲目地編碼。它不能區分在URL或者查詢string中被用到的特殊字元(象前面string中的“=”,和“&”)和確實需要被編碼的字元。由此,所以URL需要像下面這樣一次只編碼一塊:

String query = URLEncoder.encode("pg");
query += "=";
query += URLEncoder.encode("q");
query += "&";
query += URLEncoder.encode("kl");
query += "=";
query += URLEncoder.encode("XX");
query += "&";
query += URLEncoder.encode("stype");
query += "=";
query += URLEncoder.encode("stext");
query += "&";
query += URLEncoder.encode("q");
query += "=";
query += URLEncoder.encode("\"Java I/O\"");
query += "&";
query += URLEncoder.encode("search.x");
query += "=";
query += URLEncoder.encode("38");
query += "&";
query += URLEncoder.encode("search.y");
query += "=";
query += URLEncoder.encode("3");
System.out.println(query);

這才是你真正想得到的輸出:
pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

例子7-9是一個QueryString類。在一個java物件中,它使用了類URLEncoder來編碼連續的屬性名和屬性值對,這個java物件被用來發送資料到伺服器端的程式。

當你在建立一個QueryString物件時,你可以把查詢string中的第一個屬性對傳遞給類QueryString的建構函式,得到初始string。如果要繼續加入後面的屬性對,就應呼叫方法add(),它也能接受兩個string作為引數,能對它們進行編碼。方法getQuery( )返回一個屬性對被逐個編碼後得到的整個string。

Example 7-9. -The QueryString class
package com.macfaq.net;

import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;

public class QueryString {
  private StringBuffer query = new StringBuffer();

public QueryString(String name, String value) { 
  encode(name, value);
}

public synchronized void add(String name, String value) {
  query.append('&');
  encode(name, value);
}

private synchronized void encode(String name, String value) {
  try {
    query.append(URLEncoder.encode(name, "UTF-8"));
    query.append('=');
    query.append(URLEncoder.encode(value, "UTF-8"));
} catch (UnsupportedEncodingException ex) {
     throw new RuntimeException("Broken VM does not support UTF-8");
}
}

public String getQuery() {
  return query.toString();
}

public String toString() {
  return getQuery();
}
}

利用這個類,現在我們就能對前面那個例子中的string進行編碼了:
QueryString qs = new QueryString("pg", "q");
qs.add("kl", "XX");
qs.add("stype", "stext");
qs.add("q", "+\"Java I/O\"");
qs.add("search.x", "38");
qs.add("search.y", "3");
String url = "
http://www.altavista.com/cgi-bin/query?"
+ qs;
System.out.println(url);

二、URLDecoder
    與URLEncoder 類相對應的URLDecoder 類有兩種靜態方法。它們解碼以x-www-form-url-encoded這種形式編碼的string。也就是說,它們把所有的加號(+)轉換成空格符,把所有的%xx分別轉換成與之相對應的字元:
public static String decode(String s) throws Exception
public static String decode(String s, String encoding) // Java 1.4 throws UnsupportedEncodingException

第一種解碼方法在java1.3和java1.2中使用。第二種解碼方法在java1.4和更新的版本中使用。如果你拿不定主意用哪種編碼方式,那就選擇UTF-8吧。它比其他任何的編碼形式更有可能得到正確的結果。

如果string包含了一個“%”,但緊跟其後的不是兩位16進位制的數或者被解碼成非法序列,該方法就會丟擲IllegalArgumentException 異常。當下次再出現這種情況時,它可能就不會被丟擲了。這是與執行環境相關的,當檢查到有非法序列時,拋不丟擲IllegalArgumentException 異常,這時到底會發生什麼是不確定的。在Sun's JDK 1.4中,不會丟擲什麼異常,它會把一些莫名其妙的位元組加進不能被順利編碼的string中。這的確令人頭疼,可能就是一個安全漏洞。

由於這個方法沒有觸及到非轉義字元,所以你可以把整個URL作為引數傳給該方法,不用像之前那樣分塊進行。例如:
String input = "
http://www.altavista.com/cgi-bin/"
+ "query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3";
try {
  String output = URLDecoder.decode(input, "UTF-8");
  System.out.println(output);
}

相關推薦

javaURjavaURLEncoderURLDecoderLEncoderURLDecoder

下面就是它的輸出。需要注意的是這些程式碼應該以其他編碼形式被儲存而不是以ASCII碼的形式,還有就是你選擇的編碼形式應該作為一個引數傳給編譯器,讓編譯器能據此對原始碼中的非ASCII字元作出正確的解釋。 % javac -encoding UTF8 EncoderTest % java EncoderTes

java的數據運算符的總結歸類。

等等 宋體 表示 參數 強制轉換 賦值運算 對象 強制 特點 首先學習java肯定先要了解java的發展史,以及java的特點,常見的dos命令,jdk的安裝,如何開發java程序等等一下概念行的東西,這裏面我都不一一說了。 今天這一章主要想總結一下java中的數據類型和運

JAVA分為基本數據引用數據型區別

zha ole ble 雙精度 全局變量 直接 布爾類型 周期 裏的 一、基本數據類型: byte:Java中最小的數據類型,在內存中占8位(bit),即1個字節,取值範圍-128~127,默認值0 short:短整型,在內存中占16位,即2個字節,取值範圍-32768~3

Java的基本引用型變量的區別

new jre ear ref 數據 這一 對象類型 完成 值傳遞 基本類型: 基本類型自然不用說了,它的值就是一個數字,一個字符或一個布爾值。 引用類型: 是一個對象類型,值是什麽呢?它的值是指向內存空間的引用,就是地址,所指向的內存中保存著變量所表示的一個值或一組

Java的基本包裝

屬性和方法 bject 關鍵字 map 基本類型 idt arr 通過 clas Java中基本數據類型與包裝類型有 基本類型 包裝器類型 boolean Boolean char Character int Integer byte

java,方法參數是基本引用型的區別

關系 傳遞 類型 參數 變量 找到 外部 內存地址 chan 方法參數是基本類型時,傳遞的是值。 方法參數是引用類型時,傳遞的是內存地址值 當參數是基本類型時,在調用方法時將值傳遞到方法中,運行方法,運行結束方法退出,對原本main中定義的變量沒有任何操作(方法中沒有re

java物件鎖對比分析

      說到鎖機制,不得不提到Thread執行緒,而又不得不提到synchronized關鍵字,這個單詞的意思是表示“同步”的意思。用它去修飾方法函式的時候,如果有多個執行緒同時呼叫這個方法函式的時候,那麼當一個執行緒獲得鎖的時候,其他的執行緒只

Java內部鎖(synchronized)物件鎖

版權宣告:本文為博主原創文章,轉載請註明出處。 https://blog.csdn.net/qq_25827845/article/details/77688880        synchronized是Java提供的內部鎖,裡邊有類鎖和物件鎖;在靜態方

Java物件json互相轉換的工具

package com.Dingyu.util; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaT

Java的基本數據引用數據型的區別

傳遞 做出 定義 精度 技術分享 text 數組類 float java 一、數據類型 Java中的數據類型分為兩大類,基本數據類型和引用數據類型。 1、基本數據類型 基本數據類型只有8種,可按照如下分類 ①整數類型:long、int、short、byte ②浮點類型:fl

Java正則表示式相關PatternMatcher的使用

在Java中,java.util.regex包定義了正則表示式使用到的相關類,其中最主要的兩個類為:Pattern、Matcher:   Pattern 編譯正則表示式後建立一個匹配模式;   Matcher 使用Pattern例項提供的正則表示式對目標字串進行匹

Java載入Class.forName();java反射機制與原理

對於大部分人來說,第一次見到class.forName(String className)這句程式碼應該是在使用jdbc方式連線資料庫的時候。但這句程式碼本質上是什麼含義,做了什麼工作呢?本文將回答此問題。 理解Class.forName方法需要一些知識鋪墊,也就是

java--繼承實現的介面含有相同的方法

首先,說一下,當某一個類實現了兩個介面的時候,兩個介面中存在兩個相同的方法,在實現的類中只需實現一個方法的方法體。當一個類繼承一個類,並且實現一個或者多個介面的時候,其中,父類和父介面中存在相同的方法。  如果子類中存在該方法的實現體或者說是覆蓋,則使用該類的物件去掉用該方法

java元件、方法事件的辨析

主要來源於網上資料的總結 1、類 Class  元件Component 元件對外暴露一個或多個介面,供外界呼叫。元件內部由多個類來協同實現指定的功能。對於複雜的元件,會包括很多類,還可能包含配置檔案、介面、依賴的庫檔案等,元件也可以包含或者使用其他的元件,構成更大粒度的

細說JAVACollection介面Map介面的主要實現

特此宣告:這是博主很久很久以前儲存在本地的文章,當時沒有記錄出處,因為找不到出處了,現註明是轉載!!!! Collection介面 Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而

整理 JAVA的IO流 (字符流字節流兩個大

sem tint io流 return char 如果 建立 err 管道流 java中的io流分為兩類,字符和字節: OutputStream和InputStream字節流的父類,抽象。OutputStream有兩個提供了實現的接口closable和flushable。

集合 Java的集合解析一些有深入的面試題

第一題:       現有的程式程式碼模擬產生了16個日誌物件,並且需要執行16秒才能列印完這些日誌,請在程式中增加4個執行緒去呼叫parseLog()方法來分頭列印       這16個日誌物件,程式只需要執行4秒即可列印完這些日誌物件。 原始程式碼: pub

Java多型過載方法引數分別為父時的疑惑

問題: 程式碼如下: class A { public String show(D obj){ return ("A and D"); } public String show(A obj){

java遍歷實體屬性型別,屬性值

[java] view plain copy print? publicstaticvoid testReflect(Object model) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentExcept