本篇文章為大家展示了URL地址中出現(xiàn)中文亂碼如何解決,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供武山網(wǎng)站建設、武山做網(wǎng)站、武山網(wǎng)站設計、武山網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、武山企業(yè)網(wǎng)站模板建站服務,十余年武山做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
1. 問題的引出
在Restful的服務設計中,查詢某些信息的時候,一般的URL地址設計為: get /basic/service? keyword=歷史 , 之類的URL地址。 但是,在實際的開發(fā)和使用中,確是有亂碼情況的發(fā)生,在后臺的讀取keyword信息為亂碼,無法正確讀取。
2. 亂碼是如何產(chǎn)生的?
由于我們利用URL傳遞參數(shù)這種方式是依賴與瀏覽器環(huán)境中的,也就是說URL及URL中包含的各個key=value格式的傳遞參數(shù)鍵值對參數(shù)是在瀏覽器地址欄中的處理原理處理相應編碼后傳遞至后臺進行解碼的。
由于我們沒有進行任何處理,此時javascript請求URL并傳參數(shù)存在中文時(也就是說輸入框中輸入中文時),對URL的中文參數(shù)進行編碼是按照瀏覽器機制進行編碼的。此時編碼存在亂碼問題。
3. 初次編碼, javascript中利用encodeURI()方法進行編碼。
利用encodeURI()在javascript中對中文URL參數(shù)進行編碼時,“測試”二字會被轉(zhuǎn)換為“%E6%B5%8B%E8%AF%95”。 但是問題依然存在。原因是在編碼后的字符串信息,瀏覽器機制會認為“%”是一個轉(zhuǎn)義字符,瀏覽器會把地址欄URL中的傳遞的已轉(zhuǎn)換參數(shù)“%”與“%”之間的已轉(zhuǎn)義字符進行處理傳遞到后臺中。這樣會造成與實際經(jīng)過encodeURI()編碼后的URL不符,因為瀏覽器誤認為“%”是轉(zhuǎn)義字符字符了,它并未將“%”認為是個普通字符。
4. 二次編碼,使用encodeURI
操作:
encodeURI(encodeURI("/order?name=" + name));
處理后的URL不在是通過一次 encodeURI()轉(zhuǎn)換后的字符串”%E6%B5%8B%E8%AF%95“,而是經(jīng)過上一步兩層encodeURI()處理URL處理后的字符串”%25E6%B255%258B%25E8%AF%2595“,通過再次編碼原有被瀏覽起解析為轉(zhuǎn)義字符的”%“被再次編碼,轉(zhuǎn)換成了普通字符轉(zhuǎn)”%25“。
此時前端javascript代碼對帶有中文的URL編碼已經(jīng)完成,并通過URL傳遞參數(shù)的方式傳遞到后臺等待處理,Action獲取到正常轉(zhuǎn)換切無亂碼的參數(shù)為”%25E6%B255%258B%25E8%AF%2595“,此字符串對應的中文正是我們輸入的”測試“二字。
5. 后臺如何正確解析中文字符信息?
進入后臺的信息,在經(jīng)過二次encodeURI()之后,直接讀取是無法后去正確的信息的。 需要繼續(xù)如下處理:
URLDecoder.decode("chinese string","UTF-8")
URLDecoder的decode(String str,String ecn)方法有兩個參數(shù),第一個參數(shù)為待解碼的字符串,第二個參數(shù)為解碼時的對應編碼。
6. encodeURI, encodeURIComponent, escape
6.1 escape()函數(shù)
escape() 函數(shù)可對字符串進行編碼,這樣就可以在所有的計算機上讀取該字符串。
返回值:已編碼的 string 的副本。其中某些字符被替換成了十六進制的轉(zhuǎn)義序列。
說明 :該方法不會對 ASCII 字母和數(shù)字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。其他所有的字符都會被轉(zhuǎn)義序列替換。所有的空格符、標點符號、特殊字符以及其他非ASCII字符都將被轉(zhuǎn)化成%xx格式的字符編碼(xx等于該字符在字符集表里面的編碼的16進制數(shù)字)。比如,空格符對應的編碼是%20。不會被此方法編碼的字符: @ * / +
6.2 encodeURI() 方法
把URI字符串采用UTF-8編碼格式轉(zhuǎn)化成escape格式的字符串。不會被此方法編碼的字符:! @ # $& * ( ) = : / ; ? + '
6.3 encodeURIComponent() 方法
把URI字符串采用UTF-8編碼格式轉(zhuǎn)化成escape格式的字符串。與encodeURI()相比,這個方法將對更多的字符進行編碼,比如 / 等字符。所以如果字符串里面包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字符被編碼之后URL將顯示錯誤。
不會被此方法編碼的字符:! * ( ) '
因此,對于中文字符串來說,如果不希望把字符串編碼格式轉(zhuǎn)化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用escape。如果你的頁面是GB2312或者其他的編碼,而接受參數(shù)的頁面是UTF-8編碼的,就要采用encodeURI或者encodeURIComponent。
7. 另一種處理URL的中文亂碼方案
請求端的中字符有encodeURI進行一次轉(zhuǎn)碼,如:
var url="/ajax?name="+encodeURI(name);
服務器端代碼:
name=new String(name.getBytes("iso8859-1"),"UTF-8");
注: name為獲得的字符串,iso8859-1為項目的默認字符編碼,如果為中文編碼gbk,gb2312等則不用這一步進行處理.
分析: 經(jīng)過程序驗證,結果可行的。 由此可知,瀏覽器本身默認的編碼方式是iso8859-1的方式,即使使用了encodeURI進行了utf-8編碼處理,主要的字符串內(nèi)容,比如ascii字符和可見字符都還是基于iso8859-1瀏覽器自身的字符。原因就是這些字符在編碼上和UTF-8字符串是重合的。而encodeURI之類的轉(zhuǎn)義函數(shù)主要解決,特殊字符%,/之類的字符的轉(zhuǎn)義問題。
上述內(nèi)容就是URL地址中出現(xiàn)中文亂碼如何解決,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章名稱:URL地址中出現(xiàn)中文亂碼如何解決
網(wǎng)頁路徑:http://jinyejixie.com/article4/ijgeoe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設、云服務器、網(wǎng)站維護、電子商務、網(wǎng)站收錄、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)