URL地址中的中文亂碼怎麼解決?
引言: 在Restful類的服務設計中,經常會碰到需要在URL地址中使用中文作為的引數的情況,這種情況下,一般都需要正確的設定和編碼中文字元資訊。亂碼問題就此產生了,該如何解決呢?且聽本文詳細道來。
1. 問題的引出
在Restful的服務設計中,查詢某些資訊的時候,一般的URL地址設計為: get /basic/service? keyword=歷史 , 之類的URL地址。 但是,在實際的開發和使用中,確是有亂碼情況的發生,在後臺的讀取keyword資訊為亂碼,無法正確讀取。
2. 亂碼是如何產生的?
由於我們利用URL傳遞引數這種方式是依賴與瀏覽器環境中的,也就是說URL及URL中包含的各個key=value格式的傳遞引數鍵值對引數是在瀏覽器位址列中的處理原理處理相應編碼後傳遞至後臺進行解碼的。
由於我們沒有進行任何處理,此時javascript請求URL並傳引數存在中文時(也就是說輸入框中輸入中文時),對URL的中文引數進行編碼是按照瀏覽器機制進行編碼的。此時編碼存在亂碼問題。
3. 初次編碼, javascript中利用encodeURI()方法進行編碼。
利用encodeURI()在javascript中對中文URL引數進行編碼時,“測試”二字會被轉換為“%E6%B5%8B%E8%AF%95”。 但是問題依然存在。原因是在編碼後的字串資訊,瀏覽器機制會認為“%”是一個跳脫字元,瀏覽器會把位址列URL中的傳遞的已轉換引數“%”與“%”之間 的已跳脫字元進行處理傳遞到後臺中。這樣會造成與實際經過encodeURI()編碼後的URL不符,因為瀏覽器誤認為“%”是跳脫字元字元了,它並未將 “%”認為是個普通字元。
4. 二次編碼,使用encodeURI
操作:
處理後的URL不在是透過一次 encodeURI()轉換後的字串”%E6%B5%8B%E8%AF%95“,而是經過上一步兩層encodeURI()處理URL處理後的字元 串”%25E6%B255%258B%25E8%AF%2595“,透過再次編碼原有被瀏覽起解析為跳脫字元的”%“被再次編碼,轉換成了普通字元 轉”%25“。
此時前端javascript程式碼對帶有中文的URL編碼已經完成,並透過URL傳遞引數的方式傳遞到後臺等待處理,Action獲取到正常轉換切無亂碼 的引數為”%25E6%B255%258B%25E8%AF%2595“,此字串對應的中文正是我們輸入的”測試“二字。
5. 後臺如何正確解析中文字元資訊?
進入後臺的資訊,在經過二次encodeURI()之後,直接讀取是無法後去正確的資訊的。 需要繼續如下處理:
URLDecoder的decode(String str,String ecn)方法有兩個引數,第一個引數為待解碼的字串,第二個引數為解碼時的對應編碼。
6. encodeURI, encodeURIComponent, escape
6.1 escape()函式
escape() 函式可對字串進行編碼,這樣就可以在所有的計算機上讀取該字串。
返回值:已編碼的 string 的副本。其中某些字元被替換成了十六進位制的轉義序列。
說明 :該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。其他所有的字元都會被轉義序列替換。所有的空格符、標點符號、特殊字元以及其他非ASCII字元都將被轉化成%xx格式的字元編碼(xx等於該字元在字 符集表裡面的編碼的16進位制數字)。比如,空格符對應的編碼是%20。不會被此方法編碼的字元: @ * / +
6.2 encodeURI() 方法
把URI字串採用UTF-8編碼格式轉化成escape格式的字串。不會被此方法編碼的字元:! @ # $& * ( ) = : / ; ? + '
6.3 encodeURIComponent() 方法
把URI字串採用UTF-8編碼格式轉化成escape格式的字串。與encodeURI()相比,這個方法將對更多的字元進行編碼,比如 / 等字元。所以如果字串裡面包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字元被編碼之後URL將顯示錯誤。
不會被此方法編碼的字元:! * ( ) '
因此,對於中文字串來說,如果不希望把字串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用 escape。如果你的頁面是GB2312或者其他的編碼,而接受引數的頁面是UTF-8編碼的,就要採用encodeURI或者 encodeURIComponent。
7. 另一種處理URL的中文亂碼方案
請求端的中字元有encodeURI進行一次轉碼,如:
伺服器端程式碼:
注: name為獲得的字串,iso8859-1為專案的預設字元編碼,如果為中文編碼gbk,gb2312等則不用這一步進行處理.
分析: 經過程式驗證,結果可行的。 由此可知,瀏覽器本身預設的編碼方式是iso8859-1的方式,即使使用了encodeURI進行了utf-8編碼處理,主要的字串內容,比如 ascii字元和可見字元都還是基於iso8859-1瀏覽器自身的字元。原因就是這些字元在編碼上和UTF-8字串是重合的。而encodeURI之 類的轉義函式主要解決,特殊字元%,/之類的字元的轉義問題。
1. 問題的引出
在Restful的服務設計中,查詢某些資訊的時候,一般的URL地址設計為: get /basic/service? keyword=歷史 , 之類的URL地址。 但是,在實際的開發和使用中,確是有亂碼情況的發生,在後臺的讀取keyword資訊為亂碼,無法正確讀取。
2. 亂碼是如何產生的?
由於我們利用URL傳遞引數這種方式是依賴與瀏覽器環境中的,也就是說URL及URL中包含的各個key=value格式的傳遞引數鍵值對引數是在瀏覽器位址列中的處理原理處理相應編碼後傳遞至後臺進行解碼的。
由於我們沒有進行任何處理,此時javascript請求URL並傳引數存在中文時(也就是說輸入框中輸入中文時),對URL的中文引數進行編碼是按照瀏覽器機制進行編碼的。此時編碼存在亂碼問題。
3. 初次編碼, javascript中利用encodeURI()方法進行編碼。
利用encodeURI()在javascript中對中文URL引數進行編碼時,“測試”二字會被轉換為“%E6%B5%8B%E8%AF%95”。 但是問題依然存在。原因是在編碼後的字串資訊,瀏覽器機制會認為“%”是一個跳脫字元,瀏覽器會把位址列URL中的傳遞的已轉換引數“%”與“%”之間 的已跳脫字元進行處理傳遞到後臺中。這樣會造成與實際經過encodeURI()編碼後的URL不符,因為瀏覽器誤認為“%”是跳脫字元字元了,它並未將 “%”認為是個普通字元。
4. 二次編碼,使用encodeURI
操作:
1 | encodeURI(encodeURI("/order?name=" + name)); |
此時前端javascript程式碼對帶有中文的URL編碼已經完成,並透過URL傳遞引數的方式傳遞到後臺等待處理,Action獲取到正常轉換切無亂碼 的引數為”%25E6%B255%258B%25E8%AF%2595“,此字串對應的中文正是我們輸入的”測試“二字。
5. 後臺如何正確解析中文字元資訊?
進入後臺的資訊,在經過二次encodeURI()之後,直接讀取是無法後去正確的資訊的。 需要繼續如下處理:
1 | URLDecoder.decode("chinese string","UTF-8") |
6. encodeURI, encodeURIComponent, escape
6.1 escape()函式
escape() 函式可對字串進行編碼,這樣就可以在所有的計算機上讀取該字串。
返回值:已編碼的 string 的副本。其中某些字元被替換成了十六進位制的轉義序列。
說明 :該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。其他所有的字元都會被轉義序列替換。所有的空格符、標點符號、特殊字元以及其他非ASCII字元都將被轉化成%xx格式的字元編碼(xx等於該字元在字 符集表裡面的編碼的16進位制數字)。比如,空格符對應的編碼是%20。不會被此方法編碼的字元: @ * / +
6.2 encodeURI() 方法
把URI字串採用UTF-8編碼格式轉化成escape格式的字串。不會被此方法編碼的字元:! @ # $& * ( ) = : / ; ? + '
6.3 encodeURIComponent() 方法
把URI字串採用UTF-8編碼格式轉化成escape格式的字串。與encodeURI()相比,這個方法將對更多的字元進行編碼,比如 / 等字元。所以如果字串裡面包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字元被編碼之後URL將顯示錯誤。
不會被此方法編碼的字元:! * ( ) '
因此,對於中文字串來說,如果不希望把字串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用 escape。如果你的頁面是GB2312或者其他的編碼,而接受引數的頁面是UTF-8編碼的,就要採用encodeURI或者 encodeURIComponent。
7. 另一種處理URL的中文亂碼方案
請求端的中字元有encodeURI進行一次轉碼,如:
1 | var url="/ajax?name="+encodeURI(name); |
1 | name=new String(name.getBytes("iso8859-1"),"UTF-8"); |
分析: 經過程式驗證,結果可行的。 由此可知,瀏覽器本身預設的編碼方式是iso8859-1的方式,即使使用了encodeURI進行了utf-8編碼處理,主要的字串內容,比如 ascii字元和可見字元都還是基於iso8859-1瀏覽器自身的字元。原因就是這些字元在編碼上和UTF-8字串是重合的。而encodeURI之 類的轉義函式主要解決,特殊字元%,/之類的字元的轉義問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69948194/viewspace-2663858/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- URL地址中的中文亂碼問題的解決
- vscode中文亂碼怎麼解決 vscode輸出亂碼怎麼解決VSCode
- js解決url中文亂碼問題JS
- python檔案中寫中文亂碼怎麼解決Python
- cat中文正常vim中文亂碼怎麼解決?
- python urllib2中文亂碼怎麼解決Python
- 解決Url帶中文引數亂碼問題
- ROS中解決中文亂碼ROS
- python讀取文字內容中文亂碼怎麼解決Python
- 解決plsql中中文亂碼問題SQL
- MySQL解決中文亂碼MySql
- centos vim亂碼怎麼解決?CentOS
- android php 亂碼怎麼解決AndroidPHP
- 解決中文亂碼問題
- request/response解決中文亂碼
- pycharm控制檯亂碼怎麼解決?PyCharm
- C# 解決httplistener querystring 中文亂碼、返回json中文格式亂碼C#HTTPJSON
- Spring MVC 中文編碼亂碼解決SpringMVC
- win10 libreoffice開啟csv檔案中文亂碼怎麼解決Win10
- 解決Tomcat視窗中文亂碼Tomcat
- springmvc 解決中文亂碼問題SpringMVC
- MySql中文亂碼問題解決MySql
- 解決 SecureCRT 和 SecureFX 中文亂碼Securecrt
- Jmeter 解決中文亂碼問題JMeter
- Dbvisualizer9.0.6 解決中文亂碼
- python建立檔名亂碼怎麼解決Python
- win10 1809更新後控制檯出現中文亂碼怎麼解決Win10
- matplotlib 圖示 中文亂碼, 與 wordcloud 詞雲圖 中文亂碼 解決方法Cloud
- cad字型亂碼怎麼解決 cad裡面文字顯示???怎麼解決
- LiveCharts中文顯示亂碼問題的解決Echarts
- LoadRunner中文出現亂碼的解決辦法
- Sublime Text 3 中文亂碼問題的解決
- 碰見檔名變亂碼怎麼解決?
- mysql命令列查詢亂碼怎麼解決?MySql命令列
- javaweb中中文亂碼解決方法總結之response和request解決方法JavaWeb
- 解決MySQL中文亂碼和插入中文不顯示的方法MySql
- ubuntu中文顯示亂碼解決辦法Ubuntu
- Linux終端中文菱形亂碼解決方案Linux