Android 中的编码与解码
??????? 特殊符號(hào)在提交表單的時(shí)候,出現(xiàn)了編碼不一樣的問題。那么編碼是什么鬼??
?
1、什么是application/x-www-form-urlencoded字符串?
??? 它是一種編碼類型。
????當(dāng)URL地址里包含非西歐字符的字符串時(shí),系統(tǒng)會(huì)將這些字符轉(zhuǎn)換成application/x-www-form-urlencoded字符串。
? ? 表單提交時(shí)也是如此,當(dāng)包含非西歐字符的字符串時(shí),系統(tǒng)也會(huì)將這些字符轉(zhuǎn)換成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字符串 轉(zhuǎn)換成普通字符串*/String keyWord = "";try {keyWord = URLDecoder.decode("%E6%96%87%E6%A1%A3", "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}System.out.println(keyWord);/*** 將普通字符串轉(zhuǎn)換成application/x-www-form-urlencoded字符串* 必須強(qiáng)調(diào)的是編碼方式必須正確,如baidu的是gb2312,而google的是UTF-8*/String urlStr = "" ;try {urlStr = URLEncoder.encode("文檔", "Utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}System.out.println(urlStr);} }?
運(yùn)行結(jié)果是:
? 文檔
?%E6%96%87%E6%A1%A3
?
2、URLEncoder? 和? URLDecoder
??? 在java1.3和早期版本中,返回一個(gè)新的被編碼后的string,encode( ) 使用了平臺(tái)的默認(rèn)編碼形式
?? 編碼: ??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吧。它比其他任何的編碼形式更有可能得到正確的結(jié)果。
?
3、為什么要編碼?
??? 答案:處理不同操作系統(tǒng)間的差異性
? web設(shè)計(jì)者面臨的眾多難題之一便是怎樣處理不同操作系統(tǒng)間的差異性。這些差異性能引起URL方面的問題:例如,一些操作系統(tǒng)允許文件名中含有空格符,有些又不允許。
? 大多數(shù)操作系統(tǒng)不會(huì)認(rèn)為文件名中含有符號(hào)“#”會(huì)有什么特殊含義;但是在一個(gè)URL中,符號(hào)“#”表示該文件名已經(jīng)結(jié)束,后面會(huì)緊跟一個(gè)fragment(部分)標(biāo)識(shí)符。其他的特殊字符,? 非字母數(shù)字字符集,它們?cè)赨RL或另一個(gè)操作系統(tǒng)上都有其特殊的含義,表述著相似的問題。為了解決這些問題
我們在URL中使用的字符就必須是一個(gè)ASCII字符集的固定字集中的元素,具體如下:
?? 1.大寫字母A-Z
?? 2.小寫字母a-z
?? 3.數(shù)字 0-9
?? 4.標(biāo)點(diǎn)符 - _ . ! ~ * ' (和 ,)
? 如果向服務(wù)器提交數(shù)據(jù)中含有? / & ? @ # ; $ + = %,這些字符和所有其他字符就應(yīng)該被編碼。
? 編碼過程非常簡(jiǎn)單,任何字符只要不是ASCII碼數(shù)字,字母,或者前面提到的標(biāo)點(diǎn)符,它們都將被轉(zhuǎn)換成字節(jié)形式,每個(gè)字節(jié)都寫成這種形式:一個(gè)“%”后面跟著兩位16進(jìn)制的數(shù)值。
? 空格是一個(gè)特殊情況,因?yàn)樗鼈兲匠A恕K吮痪幋a成“%20”以外,還能編碼為一個(gè)“+”。加號(hào)(+)本身被編碼為%2B。
? 當(dāng)/ # = & 和?作為名字的一部分來使用時(shí),而不是作為URL部分之間的分隔符來使用時(shí),它們都應(yīng)該被編碼。
?
4、如何編碼?
? ?類URL并不自動(dòng)執(zhí)行編碼或解碼工作。幸運(yùn)的是,java提供了一個(gè)類URLEncoder把string編碼成這種形式。
?? Java1.2增加了一個(gè)類URLDecoder它能以這種形式解碼string。
?
5、網(wǎng)頁中的表單使用POST方法提交時(shí),數(shù)據(jù)內(nèi)容的類型是 application/x-www-form-urlencoded,這種類型會(huì):
??? 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不會(huì)被編碼;
??? 2.將空格轉(zhuǎn)換為加號(hào) (+) ;
??? 3.將非文本內(nèi)容轉(zhuǎn)換成"%xy"的形式,xy是兩位16進(jìn)制的數(shù)值;
??? 4.在每個(gè) name=value 對(duì)之間放置 & 符號(hào)
?
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Android 中的编码与解码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Http请求框架二:xU
- 下一篇: Android 5中不同效果的Toast