Java 解決中文亂碼問題
一:服務端解析客戶端
<% request.setCharacterEncoding("GB18030") %>
在服務端解析客戶端的編碼設定(即伺服器接收瀏覽器傳送的資料),採用GB18030的方式,但是這樣有一點不好,如果我有1000個頁面(.jsp)需要設定需要重複寫這樣的語句1000條,重複工作,針對此問題的解決,下面給出瞭解決方案
二:客戶端解析服務端
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>
客戶端解析服務端返回的資料的編碼方式(即瀏覽器呈現的頁面的編碼方式),如果一個.html 想改為.jsp,必須新增此句
三:Filter設定編碼
public class CharsetEncodingFilter implements Filter {
private String encoding="";
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
//設定字符集,攔截request請求
request.setCharacterEncoding(this.encoding);
//繼續往下執行,這體現了職責鏈模式
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化時,通過引數讀取filter的配置檔案的value值,即讀取設定的編碼方式
this.encoding = filterConfig.getInitParameter("encoding");
}
}
需要注意的幾點:
- Filter是在tomcat啟動時new的,生命是由tomcat控制的
- Filter只對Post請求起作用
- Filter其實是對Request和Response請求進行了攔截
- Filter可看作是一種橫切性的技術,面向切面的變成
- Filter體現了“職責鏈模式”
- 實現Filter需要實現javax.servlet.Filter介面,還要在web.xml檔案中進行配置
- Filter提供了一種宣告式服務,宣告式服務非常強大,具有可插拔能力
- 宣告式服務
- 只需要宣告在哪裡where做什麼what,而不需關心如何實現how(體現為要在web.xml宣告對哪個檔案wher設定那種編碼what,具體怎麼實現寫在了filter類中)
- 程式設計式服務
- 需要以具體的程式碼表達在哪裡where做什麼what,如何實現how
配置檔案web.xml設定如下:
- 需要以具體的程式碼表達在哪裡where做什麼what,如何實現how
- 宣告式服務
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class> <!-- 具體的類路徑 -->
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
<!-- 體現了鍵值對,設定引數,在filter類中可根據encodign引數,取值GBK -->
</init-param>
</filter>
<filter-mapping>
<!-- 對所有的.jsp起作用-->
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
如果想對別的檔案也起作用:再添一個對映即可
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
匹配檔案的一種寫法:
- 精準匹配 寫完整的路徑
- 擴充套件匹配,有星號*和副檔名組成,如
*.jsp
- 路徑字首匹配,包含一個目錄和一個/
*
,如/servlet/*,但不能寫/servlet/*.jsp
- 全部匹配,一般使用/*
執行過程:
這樣不用在每個.jsp中設定了,每次在請求服務端時,都會先走Filter,設定一下編碼
四:Get提交中文亂碼
上面提到,Filter只對Post提交起作用,那麼當Get提交時,怎麼設定那,難道只能每個.jsp都要寫一遍嗎,當然不是,
- Get提交可以考慮改變伺服器的配置,如Tomcat需要修改conf下的server.xml檔案,如:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="GB18030"/>
- 對中文采用java.net.URLEncoder.encode()進行編碼,如重定向時URL中有中文:
response.sendRedirect(request.getContextPath() + "/item_maint.jsp?errorMessage=" + URLEncoder.encode(errorMessage,"GB18030"));
相關文章
- 解決中文亂碼問題
- springmvc 解決中文亂碼問題SpringMVC
- MySql中文亂碼問題解決MySql
- Jmeter 解決中文亂碼問題JMeter
- js解決url中文亂碼問題JS
- 解決plsql中中文亂碼問題SQL
- phantomjs截圖中文亂碼問題解決JS
- linux 安裝字型解決JAVA圖形中文亂碼問題LinuxJava
- java中亂碼問題解決方法Java
- 雲伺服器中文亂碼問題解決伺服器
- 解決Url帶中文引數亂碼問題
- Sublime Text 3 中文亂碼問題的解決
- python json.dumps中文亂碼問題解決PythonJSON
- SqlServer資料庫中文亂碼問題解決SQLServer資料庫
- 完美解決jspdf各種中文亂碼問題JS
- 解決zabbix圖形化中文亂碼問題
- LiveCharts中文顯示亂碼問題的解決Echarts
- Java GBK 中文亂碼問題分析Java
- 解決Eclipse中文註釋部分亂碼的問題Eclipse
- URL地址中的中文亂碼問題的解決
- Mysql中文亂碼問題的最佳解決方法MySql
- Java Web開發中文亂碼問題JavaWeb
- 解決PHP匯出CSV檔案中文亂碼問題PHP
- IDEA裡Tomcat Console日誌中文亂碼問題解決IdeaTomcat
- 如何解決PuTTY中文亂碼的問題
- mysql5.7.22設定中文編碼-解決亂碼問題LinuxMySqlLinux
- vscode中文亂碼問題VSCode
- EasyUI 中文亂碼問題UI
- 解決ajax get post方式提交中文引數亂碼問題
- 常見php與mysql中文亂碼問題解決辦法PHPMySql
- whisper v3 finetune 中文亂碼問題的解決方案
- MySQL解決中文亂碼MySql
- 解決java web中safari瀏覽器下載後檔案中文亂碼問題JavaWeb瀏覽器
- python爬蟲爬取網頁中文亂碼問題的解決Python爬蟲網頁
- 解決tomcat啟動控制檯輸出中文亂碼問題-ideaTomcatIdea
- Python BeautifulSoup中文亂碼問題Python
- SSM解決中文存入資料庫亂碼問題(記錄自己的問題)SSM資料庫
- 解決Kali Linux 2020.1亂碼問題Linux
- TongWeb下亂碼問題解決思路Web