解決URL地址中的中文亂碼問(wèn)題的辦法
解決URL地址中的中文亂碼問(wèn)題的辦法
引言: 在Restful類的服務(wù)設(shè)計(jì)中,經(jīng)常會(huì)碰到需要在URL地址中使用中文作為的參數(shù)的情況,這種情況下,一般都需要正確的設(shè)置和編碼中文字符信息。亂碼問(wèn)題就此產(chǎn)生了,該如何解決呢?且聽(tīng)本文詳細(xì)道來(lái)。
1. 問(wèn)題的引出
在Restful的服務(wù)設(shè)計(jì)中,查詢某些信息的時(shí)候,一般的URL地址設(shè)計(jì)為: get /basic/service? keyword=歷史 , 之類的URL地址。 但是,在實(shí)際的開(kāi)發(fā)和使用中,確是有亂碼情況的發(fā)生,在后臺(tái)的讀取keyword信息為亂碼,無(wú)法正確讀取。
2. 亂碼是如何產(chǎn)生的?
由于我們利用URL傳遞參數(shù)這種方式是依賴與瀏覽器環(huán)境中的,也就是說(shuō)URL及URL中包含的各個(gè)key=value格式的傳遞參數(shù)鍵值對(duì)參數(shù)是在瀏覽器地址欄中的處理原理處理相應(yīng)編碼后傳遞至后臺(tái)進(jìn)行解碼的。
由于我們沒(méi)有進(jìn)行任何處理,此時(shí)javascript請(qǐng)求URL并傳參數(shù)存在中文時(shí)(也就是說(shuō)輸入框中輸入中文時(shí)),對(duì)URL的中文參數(shù)進(jìn)行編碼是按照瀏覽器機(jī)制進(jìn)行編碼的。此時(shí)編碼存在亂碼問(wèn)題。
3. 初次編碼, javascript中利用encodeURI()方法進(jìn)行編碼。
利用encodeURI()在javascript中對(duì)中文URL參數(shù)進(jìn)行編碼時(shí),“測(cè)試”二字會(huì)被轉(zhuǎn)換為“%E6%B5%8B%E8%AF%95”。 但是問(wèn)題依然存在。原因是在編碼后的字符串信息,瀏覽器機(jī)制會(huì)認(rèn)為“%”是一個(gè)轉(zhuǎn)義字符,瀏覽器會(huì)把地址欄URL中的傳遞的已轉(zhuǎn)換參數(shù)“%”與“%”之間的已轉(zhuǎn)義字符進(jìn)行處理傳遞到后臺(tái)中。這樣會(huì)造成與實(shí)際經(jīng)過(guò)encodeURI()編碼后的URL不符,因?yàn)闉g覽器誤認(rèn)為“%”是轉(zhuǎn)義字符字符了,它并未將“%”認(rèn)為是個(gè)普通字符。
4. 二次編碼,使用encodeURI
操作:
encodeURI(encodeURI("/order?name=" + name));
處理后的URL不在是通過(guò)一次 encodeURI()轉(zhuǎn)換后的字符串”%E6%B5%8B%E8%AF%95“,而是經(jīng)過(guò)上一步兩層encodeURI()處理URL處理后的字符串”%25E6%B255%258B%25E8%AF%2595“,通過(guò)再次編碼原有被瀏覽起解析為轉(zhuǎn)義字符的”%“被再次編碼,轉(zhuǎn)換成了普通字符轉(zhuǎn)”%25“。
此時(shí)前端javascript代碼對(duì)帶有中文的URL編碼已經(jīng)完成,并通過(guò)URL傳遞參數(shù)的方式傳遞到后臺(tái)等待處理,Action獲取到正常轉(zhuǎn)換切無(wú)亂碼的參數(shù)為”%25E6%B255%258B%25E8%AF%2595“,此字符串對(duì)應(yīng)的中文正是我們輸入的”測(cè)試“二字。
5. 后臺(tái)如何正確解析中文字符信息?
進(jìn)入后臺(tái)的信息,在經(jīng)過(guò)二次encodeURI()之后,直接讀取是無(wú)法后去正確的信息的。 需要繼續(xù)如下處理:
URLDecoder.decode("chinese string","UTF-8")
URLDecoder的decode(String str,String ecn)方法有兩個(gè)參數(shù),第一個(gè)參數(shù)為待解碼的字符串,第二個(gè)參數(shù)為解碼時(shí)的對(duì)應(yīng)編碼。
6. encodeURI, encodeURIComponent, escape
6.1 escape()函數(shù)
escape() 函數(shù)可對(duì)字符串進(jìn)行編碼,這樣就可以在所有的計(jì)算機(jī)上讀取該字符串。
返回值:已編碼的 string 的副本。其中某些字符被替換成了十六進(jìn)制的轉(zhuǎn)義序列。
說(shuō)明 :該方法不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼,也不會(huì)對(duì)下面這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: - _ . ! ~ * ' ( ) 。其他所有的字符都會(huì)被轉(zhuǎn)義序列替換。所有的空格符、標(biāo)點(diǎn)符號(hào)、特殊字符以及其他非ASCII字符都將被轉(zhuǎn)化成%xx格式的字符編碼(xx等于該字符在字符集表里面的編碼的16進(jìn)制數(shù)字)。比如,空格符對(duì)應(yīng)的編碼是%20。不會(huì)被此方法編碼的字符: @ * / +
6.2 encodeURI() 方法
把URI字符串采用UTF-8編碼格式轉(zhuǎn)化成escape格式的字符串。不會(huì)被此方法編碼的字符:! @ # $& * ( ) = : / ; ? + '
6.3 encodeURIComponent() 方法
把URI字符串采用UTF-8編碼格式轉(zhuǎn)化成escape格式的字符串。與encodeURI()相比,這個(gè)方法將對(duì)更多的字符進(jìn)行編碼,比如 / 等字符。所以如果字符串里面包含了URI的幾個(gè)部分的話,不能用這個(gè)方法來(lái)進(jìn)行編碼,否則 / 字符被編碼之后URL將顯示錯(cuò)誤。
不會(huì)被此方法編碼的字符:! * ( ) '
因此,對(duì)于中文字符串來(lái)說(shuō),如果不希望把字符串編碼格式轉(zhuǎn)化成UTF-8格式的(比如原頁(yè)面和目標(biāo)頁(yè)面的charset是一致的時(shí)候),只需要使用escape。如果你的頁(yè)面是GB2312或者其他的編碼,而接受參數(shù)的頁(yè)面是UTF-8編碼的,就要采用encodeURI或者encodeURIComponent。
7. 另一種處理URL的中文亂碼方案
請(qǐng)求端的中字符有encodeURI進(jìn)行一次轉(zhuǎn)碼,如:
var url="/ajax?name="+encodeURI(name);
服務(wù)器端代碼:
name=new String(name.getBytes("iso8859-1"),"UTF-8");
注: name為獲得的字符串,iso8859-1為項(xiàng)目的默認(rèn)字符編碼,如果為中文編碼gbk,gb2312等則不用這一步進(jìn)行處理.
分析: 經(jīng)過(guò)程序驗(yàn)證,結(jié)果可行的。 由此可知,瀏覽器本身默認(rèn)的編碼方式是iso8859-1的方式,即使使用了encodeURI進(jìn)行了utf-8編碼處理,主要的字符串內(nèi)容,比如ascii字符和可見(jiàn)字符都還是基于iso8859-1瀏覽器自身的字符。原因就是這些字符在編碼上和UTF-8字符串是重合的。而encodeURI之類的轉(zhuǎn)義函數(shù)主要解決,特殊字符%,/之類的字符的轉(zhuǎn)義問(wèn)題。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
JavaScript基于SVG的圖片切換效果實(shí)例代碼
這篇文章主要介紹了JavaScript基于SVG的圖片切換效果實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12momentjs獲取上周、上月、前三個(gè)月的起始和結(jié)束時(shí)間(附完整代碼)
這篇文章主要給大家介紹了關(guān)于momentjs獲取上周、上月、前三個(gè)月的起始和結(jié)束時(shí)間的相關(guān)資料,在需要你進(jìn)行日期處理的地方,必然少不了moment.js的使用,需要的朋友可以參考下2023-07-07JavaScript實(shí)現(xiàn)將xml轉(zhuǎn)換成html table表格的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)將xml轉(zhuǎn)換成html table表格的方法,實(shí)例分析了javascript操作XML文件與table表格的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04學(xué)習(xí)javascript面向?qū)ο?實(shí)例講解面向?qū)ο筮x項(xiàng)卡
這篇文章主要介紹了面向?qū)ο筮x項(xiàng)卡實(shí)現(xiàn)方法,幫助大家更好地學(xué)習(xí)javascript面向?qū)ο?,感興趣的小伙伴們可以參考一下2016-01-01《JavaScript DOM 編程藝術(shù)》讀書(shū)筆記之JavaScript 簡(jiǎn)史
這篇文章主要介紹了《JavaScript DOM 編程藝術(shù)》讀書(shū)筆記之JavaScript 簡(jiǎn)史,需要的朋友可以參考下2015-01-01