最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java使用URLDecoder和URLEncoder對(duì)中文字符進(jìn)行編碼和解碼

 更新時(shí)間:2020年07月22日 08:31:01   作者:書(shū)呆子Rico  
這篇文章主要介紹了java 使用 URLDecoder 和 URLEncoder 對(duì)中文字符進(jìn)行編碼和解碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

摘要:

  URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之間的相互轉(zhuǎn)換。在本文中,我們以使用URLDecoder解決GET請(qǐng)求中文亂碼問(wèn)題為場(chǎng)景說(shuō)明 URLDecoder/URLEncoder 的用法,并給出了 application/x-www-form-urlencoded MIME 字符串的編碼規(guī)則。

一. URLDecoder/URLEncoder 使用場(chǎng)景概述

  URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之間的相互轉(zhuǎn)換。在介紹 application/x-www-form-urlencoded MIME 字符串之前,我們先考慮如下場(chǎng)景,如下圖所示:

  我們知道,在我們向客戶端發(fā)起請(qǐng)求時(shí),瀏覽器會(huì)根據(jù)請(qǐng)求URL生成相應(yīng)的請(qǐng)求報(bào)文發(fā)送給服務(wù)器。在這個(gè)過(guò)程中,如果我們?cè)跒g覽器中的地址欄中所輸入的URL包含中文字符時(shí),瀏覽器首先會(huì)將這些中文字符進(jìn)行編碼然后再發(fā)送給服務(wù)器。實(shí)際上,瀏覽器會(huì)將它們轉(zhuǎn)換為 application/x-www-form-urlencoded MIME 字符串,如下圖所示:

  更確切的,當(dāng)URL地址里包含非西歐字符的字符串時(shí),瀏覽器都會(huì)將這些非西歐字符串轉(zhuǎn)換成application/x-www-form-urlencoded MIME 字符串。在開(kāi)發(fā)過(guò)程中,我們可能涉及將普通字符串和這種特殊字符串的相關(guān)轉(zhuǎn)換,這就需要使用 URLDecoder 和 URLEncoder類(lèi)進(jìn)行實(shí)現(xiàn),其中:

  • URLDecoder類(lèi)包含一個(gè)decode(String s,String enc)靜態(tài)方法,它可以將application/x-www-form-urlencoded MIME字符串轉(zhuǎn)成普通字符串;
  • URLEncoder類(lèi)包含一個(gè)encode(String s,String enc)靜態(tài)方法,它可以將普通字符串轉(zhuǎn)換成application/x-www-form-urlencoded MIME字符串。

下面程序示范了普通字符串轉(zhuǎn)與 application/x-www-form-urlencoded MIME 字符串之間的轉(zhuǎn)化。

public class URLDecoderTest {
  public static void main(String[] args) throws Exception {

    // 將application/x-www-form-urlencoded字符串轉(zhuǎn)換成普通字符串
    // 其中的字符串直接從上圖所示窗口復(fù)制過(guò)來(lái),chrome 默認(rèn)用 UTF-8 字符集進(jìn)行編碼,所以也應(yīng)該用對(duì)應(yīng)的字符集解碼
    System.out.println("采用UTF-8字符集進(jìn)行解碼:");
    String keyWord = URLDecoder.decode("%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6+Rico", "UTF-8");
    System.out.println(keyWord);
    System.out.println("\n 采用GBK字符集進(jìn)行解碼:");
    System.out.println(URLDecoder.decode("%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6+Rico", "GBK"));

    // 將普通字符串轉(zhuǎn)換成application/x-www-form-urlencoded字符串
    System.out.println("\n 采用utf-8字符集:");
    String urlStr = URLEncoder.encode("天津大學(xué)", "utf-8");
    System.out.println(urlStr);
    System.out.println("\n 采用GBK字符集:");
    String urlStr2 = URLEncoder.encode("天津大學(xué)", "GBK");
    System.out.println(urlStr2);
  }
}/* Output: 
    采用UTF-8字符集進(jìn)行解碼:
    天津大學(xué) Rico

    采用GBK字符集進(jìn)行解碼:
    澶╂觸澶у Rico

    采用utf-8字符集:
    %E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6

    采用GBK字符集:
    %CC%EC%BD%F2%B4%F3%D1%A7
 *///:~

  特別地,僅包含西歐字符的普通字符串和application/x-www-form-urlencoded MIME字符串無(wú)須轉(zhuǎn)換,而包含中文字符的普通字符串則需要轉(zhuǎn)換,轉(zhuǎn)換的方法是每個(gè)中文字符占2個(gè)字節(jié),每個(gè)字節(jié)可以轉(zhuǎn)換成2個(gè)十六進(jìn)制的數(shù)字,所以每個(gè)中文字符將轉(zhuǎn)換成“%XX%XX”的形式。當(dāng)然,采用不同的字符集時(shí),每個(gè)中文字符對(duì)應(yīng)的字節(jié)數(shù)并不完全相同,所以使用URLEncoder和URLDecoder進(jìn)行轉(zhuǎn)換時(shí)也需要指定字符集。特別地,字符串應(yīng)以同樣的字符集進(jìn)行編碼和解碼,否則會(huì)產(chǎn)生意想不到的結(jié)果,如上述程序示例所示。

二. 解決GET請(qǐng)求中文亂碼問(wèn)題

  URLDecoder的一個(gè)應(yīng)用場(chǎng)景就是解決GET請(qǐng)求的中文亂碼問(wèn)題,如下述代碼所示:

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
  <title>Test</title>
</head>
<body>
  <%
    String param1 = request.getQueryString();
    String param2 = URLDecoder.decode(param1, "utf-8");
    out.print(param2.split("=")[1] + "<br>");
  %>
</body>
</html>

  特別需要注意的是,使用此方式對(duì)GET請(qǐng)求參數(shù)進(jìn)行解碼時(shí),我們必須先對(duì) request.getQueryString 方法的返回值(例如,“name=摩羯西門(mén)吹雪”)進(jìn)行解碼,然后再?gòu)闹腥〕鑫覀兯枰膮?shù)值。如果先取出參數(shù)值,然后再對(duì)參數(shù)值進(jìn)行解碼,則我們將得到亂碼,如下圖所示:

  此外,對(duì)于包含中文字符的POST請(qǐng)求參數(shù),我們只需在獲取請(qǐng)求參數(shù)前通過(guò)以下代碼語(yǔ)句進(jìn)行轉(zhuǎn)碼即可:

 request.setCharacterEncoding("utf-8");

三. URLEncoder & URLDecoder

  對(duì) String 編碼時(shí),使用以下規(guī)則:

  • 字母、數(shù)字和字符, “a” 到 “z”、”A” 到 “Z” 和 “0” 到 “9” 保持不變;
  • 特殊字符 “.”、”-“、”*” 和 “_” 保持不變;
  • 空格字符 ” ” 轉(zhuǎn)換為一個(gè)加號(hào) “+”。

除此之外,所有的其他字符都是不安全的。因此需要使用一些編碼機(jī)制將它們轉(zhuǎn)換為一個(gè)或多個(gè)字節(jié),每個(gè)字節(jié)用一個(gè)包含 3 個(gè)字符的字符串 “%xy” 表示,其中 xy 為該字節(jié)的兩位十六進(jìn)制表示形式,推薦的編碼機(jī)制是 UTF-8。例如,使用 UTF-8 編碼機(jī)制,字符串 “The string ü@foo-bar” 將轉(zhuǎn)換為 “The+string+%C3%BC%40foo-bar”,因?yàn)樵?UTF-8 中,字符 ü 編碼為兩個(gè)字節(jié),C3 (十六進(jìn)制)和 BC (十六進(jìn)制),字符 @ 編碼為一個(gè)字節(jié) 40 (十六進(jìn)制)。

 關(guān)于 URLDecoder 類(lèi)的使用,轉(zhuǎn)換過(guò)程正好與 URLEncoder 類(lèi)使用的過(guò)程相反,此不贅述。

  關(guān)于JSP中文亂碼更多的介紹,包括 頁(yè)面亂碼、參數(shù)亂碼、表單亂碼、源文件亂碼 等知識(shí),見(jiàn)我的另外兩篇博客:《JSP中文亂碼問(wèn)題終極解決方案(上)》《JSP中文亂碼問(wèn)題終極解決方案(下)》。

引用

使用URLDecoder和URLEncoder對(duì)中文進(jìn)行處理

到此這篇關(guān)于java使用URLDecoder和URLEncoder對(duì)中文字符進(jìn)行編碼和解碼的文章就介紹到這了,更多相關(guān)java 文字符編碼解碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java常用排序算法及性能測(cè)試集合

    Java常用排序算法及性能測(cè)試集合

    周末天氣不好,在家無(wú)事,把常用排序算法理了一遍,收獲不小,特寫(xiě)文章紀(jì)念。這些算法在學(xué)校的時(shí)候?qū)W過(guò)一遍,很多原理都忘記了
    2013-06-06
  • 使用concurrentHashMap如何實(shí)現(xiàn)緩存

    使用concurrentHashMap如何實(shí)現(xiàn)緩存

    文章介紹了使用ConcurrentHashMap實(shí)現(xiàn)緩存的線程安全性和初始化方法,以及如何處理高并發(fā)場(chǎng)景下的緩存清理和數(shù)據(jù)一致性問(wèn)題,包括分桶、使用ConcurrentLinkedQueue以及使用CountDownLatch來(lái)確保緩存數(shù)據(jù)的不丟失
    2025-02-02
  • springboot下ueditor上傳功能的實(shí)現(xiàn)及遇到的問(wèn)題

    springboot下ueditor上傳功能的實(shí)現(xiàn)及遇到的問(wèn)題

    這篇文章主要介紹了springboot下ueditor上傳功能的實(shí)現(xiàn)及遇到的問(wèn)題,本文分步驟通過(guò)實(shí)例截圖給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot快速整合SpringSecurity的詳細(xì)步驟(新手都會(huì)!)

    SpringBoot快速整合SpringSecurity的詳細(xì)步驟(新手都會(huì)!)

    日 Spring Security 是針對(duì)Spring項(xiàng)目的安全框架,也是Spring Boot底層安全模塊默認(rèn)的技術(shù)選型,他可以實(shí)現(xiàn)強(qiáng)大的Web安全控制,下面這篇文章主要給大家介紹了關(guān)于SpringBoot快速整合SpringSecurity的詳細(xì)步驟,需要的朋友可以參考下
    2023-03-03
  • Java實(shí)現(xiàn)學(xué)生選課管理系統(tǒng)

    Java實(shí)現(xiàn)學(xué)生選課管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生選課管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 一篇文章弄懂JVM類(lèi)加載機(jī)制過(guò)程以及原理

    一篇文章弄懂JVM類(lèi)加載機(jī)制過(guò)程以及原理

    JVM原理對(duì)于初學(xué)者而言,比較晦澀難以理解,概念繁多又比較抽象,很多時(shí)候感覺(jué)看不見(jiàn)摸不著,還不好驗(yàn)證,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章弄懂JVM類(lèi)加載機(jī)制過(guò)程及原理的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • springboot hazelcast緩存中間件的實(shí)例代碼

    springboot hazelcast緩存中間件的實(shí)例代碼

    這篇文章主要介紹了springboot hazelcast緩存中間件的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • Java詳解IO流創(chuàng)建讀取與寫(xiě)入操作

    Java詳解IO流創(chuàng)建讀取與寫(xiě)入操作

    這篇文章主要介紹了Java IO流,同時(shí)也介紹了流中的一些相關(guān)的內(nèi)容,并且通過(guò)大量的案例供大家理解。最后通過(guò)一些經(jīng)典的案例幫助大家對(duì)前面所學(xué)的知識(shí)做了一個(gè)綜合的應(yīng)用,需要的朋友可以參考一下
    2022-05-05
  • java判斷某個(gè)點(diǎn)是否在所畫(huà)多邊形/圓形內(nèi)

    java判斷某個(gè)點(diǎn)是否在所畫(huà)多邊形/圓形內(nèi)

    這篇文章主要為大家詳細(xì)介紹了java判斷某個(gè)點(diǎn)是否在所畫(huà)多邊形或圓形內(nèi)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Java中ExecutorService和ThreadPoolExecutor運(yùn)行原理

    Java中ExecutorService和ThreadPoolExecutor運(yùn)行原理

    本文主要介紹了Java中ExecutorService和ThreadPoolExecutor運(yùn)行原理,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論

泽库县| 旺苍县| 沁水县| 宁安市| 高雄市| 和硕县| 莱芜市| 琼结县| 永年县| 山东省| 凉城县| 阜城县| 黑水县| 海宁市| 通渭县| 海南省| 肃北| 富民县| 绥滨县| 肇庆市| 西藏| 锦州市| 衢州市| 潜山县| 鄂托克前旗| 芦溪县| 界首市| 赤城县| 苗栗市| 英德市| 金门县| 股票| 彰化县| 固始县| 南靖县| 收藏| 台安县| 景东| 行唐县| 石林| 水富县|