日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

页面URL传递中文乱码

發布時間:2023/12/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 页面URL传递中文乱码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:
關于URL編碼

##1.URL中文編碼亂碼原因
以下這段話引自網絡標準RFC 1738以及關于URL編碼

“…Only alphanumerics [0-9a-zA-Z], the special characters “$-_.+!*’(),” [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.”

“只有字母和數字[0-9a-zA-Z]、一些特殊符號”$-_.+!*’(),"[不包括雙引號]、以及某些保留字,才可以不經過編碼直接用于URL。"

這意味著,如果URL中有漢字,就必須編碼后使用。但是麻煩的是,RFC 1738沒有規定具體的編碼方法,而是交給應用程序(瀏覽器)自己決定。這導致"URL編碼"成為了一個混亂的領域。

通過解讀關于URL編碼,總結有以下幾種URL編碼情況

  • 網址路徑中包含漢字。
  • 查詢字符串包含漢字。
  • Get方法生成的URL包含漢字。
  • Ajax調用的URL包含漢字。
  • ##2.解決方案
    URL可以不經編碼的字符有:

    //[0-9a-zA-Z] //$-_.+!*'(), //某些保留字

    總結有以下幾種方案。
    ###2.1.Javascript函數:escape() [已驗證]

    <script type="text/javascript">//編碼:將需要編碼的字符編碼成Unicode值var url = escape("http://www.baidu.com/春節");document.write(url + "<br>");//解碼var url = unescape(url);document.write(url); </script>//escape不編碼字符有69個:*,+,-,.,/,@,_,0-9,a-z,A-Z //古老函數,不提倡使用

    result:

    http%3A//www.baidu.com/%u6625%u8282 http://www.baidu.com/春節

    ###2.2.Javascript函數:encodeURI() [已驗證]
    encodeURI()是Javascript中真正用來對URL編碼的函數。

    <script type="text/javascript">//編碼:輸出符號的utf-8形式,并且在每個字節前加上%,注意是兩次。var url = encodeURI("http://www.baidu.com/春節");document.write(url + "<br>");//解碼var url = decodeURI(url);document.write(url); </script>//encodeURI不編碼字符有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a- z,A-Z //建議使用

    result:

    http://www.baidu.com/%E6%98%A5%E8%8A%82 http://www.baidu.com/春節

    ###2.3.Javascript函數:encodeURIComponent() [已驗證]
    encodeURIComponent()用于對URL的組成部分進行個別編碼,而不用于對整個URL進行編碼。

    <script type="text/javascript">//編碼:輸出符號的utf-8形式,并且在每個字節前加上%,注意是兩次。var url = encodeURIComponent("http://www.baidu.com/春節");document.write(url + "<br>");//解碼var url = decodeURIComponent(url);document.write(url); </script>//encodeURIComponent不編碼字符有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z //建議使用

    result:

    http%3A%2F%2Fwww.baidu.com%2F%E6%98%A5%E8%8A%82 http://www.baidu.com/春節

    ###2.4.java.net.URLEncoder和java.net.URLDncoder [未驗證]
    HTML 格式編碼的實用工具類。該類包含了將 String 轉換為 application/x-www-form-urlencoded MIME 格式的靜態方法。
    對 String 編碼時,使用以下規則:

    • 字母數字字符 “a” 到 “z”、“A” 到 “Z” 和 “0” 到 “9” 保持不變。
    • 特殊字符 “.”、"-"、"*" 和 “_” 保持不變。
    • 空格字符 " " 轉換為一個加號 “+”。
    • 所有其他字符都是不安全的,因此首先使用一些編碼機制將它們轉換為一個或多個字節。然后每個字節用一個包含 3 個字符的字符串 “%xy” 表示,其中 xy 為該字節的兩位十六進制表示形式。推薦的編碼機制是 UTF-8。但是,出于兼容性考慮,如果未指定一種編碼,則使用相應平臺的默認編碼。

    例如,使用 UTF-8 編碼機制,字符串 “The string ü@foo-bar” 將轉換為 “The+string+%C3%BC%40foo-bar”,因為在 UTF-8 中,字符 ü 編碼為兩個字節,C3 (十六進制)和 BC (十六進制),字符 @ 編碼為一個字節 40 (十六進制)。

    //編碼 java.net.URLEncoder.encode(URIString, "UTF-8"); //解碼 java.net.URLDecoder.decode(URIString, "UTF-8"); //不推薦使用

    ###2.5.Tomcat/conf/server.xml的URIEncoding [已驗證]

    <!-- 這種方式缺點顯而易見,換了服務器就要更改,有時候忘記也是很常見的事情。 --> <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" URIEncoding="UTF-8">

    ###2.6.HttpServletRequestWrapper+Filter [未驗證]
    思路:
    1. 創建一個類繼承HttpServletRequestWrapper,重寫getParameter、getParameterValues和getParameterMap,對參數進行轉碼。
    2. 創建一個過濾器,獲取request對象,調用HttpServletRequestWrapper進行包裝解密。
    缺陷:
    1.只是對請求參數進行了轉碼,如果請求路徑中有中文,則無法處理。

    總結

    以上是生活随笔為你收集整理的页面URL传递中文乱码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。