java中form以post、get方式提交數(shù)據(jù)中文亂碼問(wèn)題總結(jié)
一:form在前臺(tái)以post方式提交數(shù)據(jù):
瀏覽器將數(shù)據(jù)(假設(shè)為“中國(guó)”)發(fā)送給服務(wù)器的時(shí)候,將數(shù)據(jù)變成0101的二進(jìn)制數(shù)據(jù)(假設(shè)為98 99)時(shí)必然要查碼表,瀏覽器以哪個(gè)碼表打開(kāi)網(wǎng)頁(yè),瀏覽器就以哪個(gè)碼表提交數(shù)據(jù)。數(shù)據(jù)到達(dá)服務(wù)器后,數(shù)據(jù)(98 99)要封裝到request中,在servlet中調(diào)用Request的getParameter方法返回的是字符串(“中國(guó)”),方法內(nèi)部拿到數(shù)字后要轉(zhuǎn)成字符,一定要查碼表,由于request的設(shè)計(jì)者是外國(guó)人,所以默認(rèn)查的是他們常用的ISO8859-1,這就是請(qǐng)求數(shù)據(jù)產(chǎn)生亂碼的根源。
package com.yyz.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//以post方式提交表單
public class RequestDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//請(qǐng)求數(shù)據(jù)的中文亂碼問(wèn)題
request.setCharacterEncoding("UTF-8");//客戶端網(wǎng)頁(yè)我們控制為UTF-8
String username = request.getParameter("username");
//獲取數(shù)據(jù)正常,輸出數(shù)據(jù)時(shí)可以查閱不同碼表
response.setCharacterEncoding("gb2312");//通知服務(wù)器發(fā)送數(shù)據(jù)時(shí)查閱的碼表
response.setContentType("text/html;charset=gb2312");//通知瀏覽器以何種碼表打開(kāi)
PrintWriter out = response.getWriter();
out.write(username);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
二:form在前臺(tái)以get方式提交數(shù)據(jù):
get方式提交的數(shù)據(jù)依然是瀏覽器用什么碼表打開(kāi)就用什么碼表發(fā)送。不同的是,以get方式提交數(shù)據(jù)時(shí),request設(shè)置編碼無(wú)效。即使設(shè)置了UTF-8還是會(huì)去查ISO8859-1。得到(? ?),要解決這個(gè)問(wèn)題,需要拿著(??)反向查ISO8859-1,拿到(98 99)后,再去查正確碼表。
package com.yyz.request;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//以get方式提交表單
public class RequestDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//請(qǐng)求數(shù)據(jù)的中文亂碼問(wèn)題
request.setCharacterEncoding("UTF-8");//以get方式提交數(shù)據(jù)時(shí),request設(shè)置編碼無(wú)效。即使設(shè)置了UTF-8還是會(huì)去查ISO8859-1
String username = request.getParameter("username");
System.out.println(username);
byte source [] = username.getBytes("iso8859-1");
username = new String (source,"UTF-8");
System.out.println(username);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
三:提交數(shù)據(jù)中文亂碼問(wèn)題總結(jié):
1.如果提交方式為post,想不亂碼,只需要設(shè)置request對(duì)象的編碼即可。
注意:客戶機(jī)數(shù)據(jù)是以哪種方式提交的,request就應(yīng)該設(shè)成什么編碼。
2.如果提交方式為get,設(shè)置request對(duì)象的編碼是無(wú)效的,想不亂碼,只能手工轉(zhuǎn)換。
String data = "???????";//亂碼字符串
byte source [] = data.getBytes("iso8859-1");//得到客戶機(jī)提交的原始數(shù)據(jù)
data = new String (data.getBytes("iso8859-1"),"UTF-8");//解決亂碼
//等同于
data = new String (source,"UTF-8");
3.get方式的亂碼,還可以通過(guò)更改服務(wù)器配置的方式實(shí)現(xiàn)。更改Tomact的conf目錄下的server.xml文件。
3.1
這種方式并不推薦,因?yàn)楦牧朔?wù)器且并不靈活。
3.2
這么設(shè)置后,request的setCharacterEncoding設(shè)置什么編碼,連接器就用什么編碼,雖然比上一種更改靈活,但依然會(huì)導(dǎo)致我們的應(yīng)用程序牢牢依賴(lài)于服務(wù)器,也不被推薦。
四:最后的最后,提一個(gè)小細(xì)節(jié):URL地址后面如果跟了中文數(shù)據(jù),一定要經(jīng)過(guò)URL編碼。表單提交的參數(shù)有中文數(shù)據(jù),瀏覽器會(huì)自動(dòng)幫我們編碼,但如果是通過(guò)鏈接直接帶中文參數(shù),瀏覽器是不會(huì)幫我們編碼的,這時(shí)想通過(guò)上述第二種方式解決中文亂碼問(wèn)題就時(shí)靈時(shí)不靈了,應(yīng)該通過(guò)URLEncoding.encode(,"UTF-8")先編碼。
- 解決javaWEB中前后臺(tái)中文亂碼問(wèn)題的3種方法
- java壓縮zip文件中文亂碼問(wèn)題解決方法
- java中Filter過(guò)濾器處理中文亂碼的方法
- java 頁(yè)面url傳值中文亂碼的解決方法
- Java讀寫(xiě).properties文件解決中文亂碼問(wèn)題
- JAVA POST與GET數(shù)據(jù)傳遞時(shí)中文亂碼問(wèn)題解決方法
- java 逐行讀取txt文本如何解決中文亂碼
- Java 解決讀寫(xiě)本地文件中文亂碼的問(wèn)題
- java頁(yè)面中文亂碼的解決辦法
- Java中文亂碼解決方案全解析,讓你的程序“說(shuō)人話”!
相關(guān)文章
排查Failed?to?validate?connection?com.mysql.cj.jdbc.Connec
這篇文章主要介紹了Failed?to?validate?connection?com.mysql.cj.jdbc.ConnectionImpl問(wèn)題排查,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2023-02-02Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)賦值的方法
這篇文章主要介紹了Mybatis-Plus實(shí)現(xiàn)公共字段自動(dòng)賦值的方法,涉及到通用字段自動(dòng)填充的最佳實(shí)踐總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07JavaSE學(xué)習(xí)之內(nèi)部類(lèi)及常用API
這篇文章主要介紹了JavaSE中的內(nèi)部類(lèi)和幾個(gè)常用的API,文中的示例代碼介紹詳細(xì),對(duì)我們學(xué)習(xí)JavaSEI有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12Mybatis讀取和存儲(chǔ)json類(lèi)型數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了Mybatis讀取和存儲(chǔ)json類(lèi)型數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06struts升級(jí)到2.5.2遇到的問(wèn)題及解決方案(推薦)
原來(lái)的版本是2.3.x,由于安全原因需要升級(jí)到2.5.2。但是在升級(jí)過(guò)程中遇到各種各樣的問(wèn)題,下面小編給大家?guī)?lái)了struts升級(jí)到2.5.2遇到的問(wèn)題及解決方案,需要的朋友參考下吧2016-11-11一文詳解如何在SpringMVC的視圖中渲染模型數(shù)據(jù)
SpringMVC是一個(gè)基于Spring框架的Web框架,它提供了一種方便的方式來(lái)處理 HTTP 請(qǐng)求和響應(yīng),在SpringMVC中,視圖是用來(lái)渲染模型數(shù)據(jù)的組件,它們負(fù)責(zé)將模型數(shù)據(jù)轉(zhuǎn)換為HTML、JSON、XML等格式的響應(yīng),在本文中,我們將討論如何在SpringMVC中的視圖中渲染模型數(shù)據(jù)2023-07-07Java簡(jiǎn)單模擬實(shí)現(xiàn)一個(gè)線程池
本文主要介紹了Java簡(jiǎn)單模擬實(shí)現(xiàn)一個(gè)線程池,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01Spring Boot應(yīng)用事件監(jiān)聽(tīng)示例詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用事件監(jiān)聽(tīng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12