Java中的編碼與解碼

來源:互聯網
上載者:User

標籤:

前言:今天遇到一個問題,一個使用者在登入的時候,出現登入失敗。但是其他使用者登入都是正常的,經過調試發現登入失敗的使用者的密碼中有兩個特殊字元: * 、#  。

        特殊符號在提交表單的時候,出現了編碼不一樣的問題。那麼編碼是什麼鬼??

 

1、什麼是application/x-www-form-urlencoded字串?

    它是一種編碼類別型。

    當URL地址裡包含非西歐字元的字串時,系統會將這些字元轉換成application/x-www-form-urlencoded字串。

    表單提交時也是如此,當包含非西歐字元的字串時,系統也會將這些字元轉換成application/x-www-form-urlencoded字串。

   

package com.app;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;public class AA {    public static void main(String[] args) {        /**         * 將application/x-www-form-urlencoded字串 轉換成一般字元串         */        String keyWord = "";        try {            keyWord = URLDecoder.decode("%E6%96%87%E6%A1%A3", "UTF-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        System.out.println(keyWord);        /**         * 將一般字元串轉換成application/x-www-form-urlencoded字串         * 必須強調的是編碼方式必須正確,如baidu的是gb2312,而google的是UTF-8         */        String urlStr = "" ;        try {            urlStr = URLEncoder.encode("文檔", "Utf-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        System.out.println(urlStr);    }}

 

運行結果是:

  文檔
 %E6%96%87%E6%A1%A3

 

2、URLEncoder

    在java1.3和早期版本中,返回一個新的被編碼後的string,encode( ) 使用了平台的預設編碼形式

   編碼:   public static String encode(String s)

   解碼:   public static String decode(String s)  

   在java1.4中及以後,要求使用者自己指定編碼形式,比如 "UTF-8" 、 "gb2312" 。

   編碼: public static String encode(String s, String encoding) throws UnsupportedEncodingException

   解碼: public static String decode(String s, String encoding) throws UnsupportedEncodingException

 

   注意:如果你拿不定主意用哪種編碼方式,那就選擇UTF-8吧。它比其他任何的編碼形式更有可能得到正確的結果。

 

3、為什麼要編碼?

    答案:處理不同作業系統間的差異性

  web設計者面臨的眾多難題之一便是怎樣處理不同作業系統間的差異性。這些差異效能引起URL方面的問題:例如,一些作業系統允許檔案名稱中含有空格符,有些又不允許。

  大多數作業系統不會認為檔案名稱中含有符號“#”會有什麼特殊含義;但是在一個URL中,符號“#”表示該檔案名稱已經結束,後面會緊跟一個fragment(部分)標識符。其他的特殊字元,  非字母數字字元集,它們在URL或另一個作業系統上都有其特殊的含義,表述著相似的問題。為瞭解決這些問題

我們在URL中使用的字元就必須是一個ASCII字元集的固定字集中的元素,具體如下:

   1.大寫字母A-Z
   2.小寫字母a-z
   3.數字 0-9
   4.標點符 - _ . ! ~ * ‘ (和 ,)

  如果向伺服器提交資料中含有  / & ? @ # ; $ + = %,這些字元和所有其他字元就應該被編碼。

  編碼過程非常簡單,任何字元只要不是ASCII碼數字,字母,或者前面提到的標點符,它們都將被轉換成位元組形式,每個位元組都寫成這種形式:一個“%”後面跟著兩位16進位的數值。

  空格是一個特殊情況,因為它們太平常了。它除了被編碼成“%20”以外,還能編碼為一個“+”。加號(+)本身被編碼為%2B。

  當/ # = & 和?作為名字的一部分來使用時,而不是作為URL部分之間的分隔字元來使用時,它們都應該被編碼。

 

4、如何編碼?

   類URL並不自動執行編碼或解碼工作。幸運的是,java提供了一個類URLEncoder把string編碼成這種形式。

   Java1.2增加了一個類URLDecoder它能以這種形式解碼string。

 

5、網頁中的表單使用POST方法提交時,資料內容的類型是 application/x-www-form-urlencoded,這種類型會:

    1.字元"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不會被編碼;
    2.將空格轉換為加號 (+) ;
    3.將非常值內容轉換成"%xy"的形式,xy是兩位16進位的數值;
    4.在每個 name=value 對之間放置 & 符號

 

Java中的編碼與解碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.