幾天有OMI的用戶反映,安裝OMI時有中文亂碼現象,我還說不可能。我們的程序在windows,linux都部署過無數次了,開發時都是UTF8編碼的,咋還會亂碼呢。結果看了半天也沒看出個啥,還是沒解決。
最近新安裝程序時,新下載了一個tomcat8.5的版本,一跑程序還真是html頁亂碼了,但JSP頁沒事。因為之前我們的程序都是跑在tomcat7,最高是tomcat8.0,沒試過更高的,高版本確實有問題,且控制臺中文也是亂碼。
一、嘗試了一些網友給的辦法,下面說一下解決方案:
1、tomcat\bin\catalina.bat 中添加,
set JAVA_OPTS=-Xms512m -Xms1024m -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8
我的添加位置如圖
?前面是正好順便設置了JVM的內存,解決問題的主要后面的部分。
2、修改tomcat\conf\server.xml,加入 URIEncoding="UTF-8"
加入如圖位置
?好象是第一步就可以了,保險起見第二步也加上吧 。
二、關于控制臺亂碼解決辦法:
修改tomcat\conf\logging.properties
#java.util.logging.ConsoleHandler.encoding = UTF-8(GBK)
將UTF-8改為GBK,或者把整行注掉
我是把相關編碼全注了
以上,如未解決問題可以加QQ群交流,群名:Kettle實戰。
文亂碼問題是比較常見和煩人的問題,本文通過一個小程序介紹了如何通過Servlet從上一個頁面獲取參數,
方法很簡單:調用request.getParameter(String s)方法。
解決中文亂碼問題的方法是:
首先要設置response響應的格式:response.setContextType("text/html;charSet=GBK");
然后在加上request.setCharacterEncoding("GBK")
需要注意的是這是解決post方式提交的內容的中文亂碼問題。
解決get方式提交內容的中文亂碼問題的方法:
在Tomcat->conf文件夾->server.xml-->connecter標簽里加上:
URIEncoding="GBK"(注意:在xml里面“=”兩邊不要有空格)
關于Post和Get之間的區別可以看我轉載的另一篇博文:
HTTP POST GET 本質區別詳解
例子:
1.threeparams.html
2.ThreeParams.java
補充:
上面的這個例子.html中每個name都不一樣,如果有多個一樣的name時,可以按如下的方法來獲取:
1)Enumeration paramNames = request.getParameterNames()
調用此方法獲得所有參數的名字,返回一個Enumeration
2) while(paramNames.hasMoreElements()){
String paramName = (String)paramNames.nextElement();
String[] paramValues = request.getParameterValues(paramName);
...
開發過程中,經常遇到中文亂碼問題,以前總是解決就好,并沒有對該問題總結一下,現在來總結一下開發過程中常見的中文亂碼問題。
一、有必要了解一些基本的編碼知識:
這篇字符編碼筆記是必讀的
jsp的三次編碼
第一階段:JVM將.jsp文件編譯為.java文件。JVM先讀取pageEncoding的值,根據該值去讀取.jsp文件,然后由指定的編碼方案生成UTF-8的.java文件。
第二階段:JVM將.java文件轉換為.class文件,從UTF-8至UTF-8。這個過程就與任何編碼的設置都沒有關系了,經過這個階段后.java文件就轉換成了統一的UTF-8編碼的.class文件了。
第三階段:服務器將處理的結果返回給瀏覽器,這個階段則依靠contentType的charset,如果設置了charset則瀏覽器就會使用指定的編碼格式進行解碼,否則采用默認的ISO-8859-1編碼格式進行解碼處理。
jsp中的編碼設置
pageEncoding:<%@ page pageEncoding=”UTF-8”%>
上文中第一階段,使用該值去讀取jsp文件,為避免中文亂碼,跟jsp文件編碼一致;對服務器響應進行重新編碼,即jsp的輸出流在瀏覽器中顯示的編碼(不是主要作用)。
contentType: <%@ page contentType=”text/html;charset=UTF-8”%>
使用該值對服務器響應進行重新編碼,即jsp的輸出流在瀏覽器中顯示的編碼;對表單get和post請求數據編碼;上文中第一階段,使用該值去讀取jsp文件(不是主要作用)。
< META http-equiv=”Content-Type” content=”text/html;charset=UTF-8”>
網頁的編碼信息 ,說明頁面制作所使用的編碼。
request.setCharacterEncoding()
可用在servlet和jsp頁面中,作用是設置對客戶端請求進行重新編碼的編碼,即post方式提交的數據進行編碼。
response.setCharacterEncoding()
與<%@ page contentType=”text/html;charset=UTF-8”%>一樣。
response.setContentType()
與<%@ page contentType=”text/html;charset=UTF-8”%>一樣。
response.setHeader(“Content-Type”,”text/html;charset=UTF-8”)
與< META http-equiv=”Content-Type” content=”text/html; charset=UTF-8”>一樣。
注意:上文1,2,3中有部分功能是一樣的,是有優先級的,在讀取jsp文件時,1>2;在對服務器響應進行編碼的時候,2>1>3,一般情況下,1,2都寫。
http請求默認以”ISO-8859-1”的編碼來傳送URL的。
二、中文亂碼的幾種情況及最簡單的解決方案:
pageEncoding設置錯誤
pageEncoding設置為jsp文件的編碼類型。
查詢字符串包含中文
中文的編碼方式取決于瀏覽器,chrome為UTF-8,IE為GB2312,這是由于瀏覽器并沒有遵循URI編碼規范。有兩種解決方法:
開發過程中,將查詢字符串提前編碼,
如:http://www.baidu.com/demo?demo=%D6%D0%B9%FA (UTF-8編碼)
在Servlet的doGet()方法中添加
1 | String value = new String(request.getParameter("parameterName").getBytes("ISO-8859-1"),"瀏覽器的編碼方式"); |
表單中的get和post數據包含中文
中文的編碼方式取決于上文的contentType中的charset,有兩種解決辦法:
在Servlet的doPost()方法中添加request.setCharacterEncoding(“charset的值”);(僅對post有用)
在Servlet的doPost()方法中添加
1 | String value = new String(request.getParameter("parameterName").getBytes("ISO-8859-1"),"charset的值"); |
三、原理
我們通過上面的方法可以解決亂碼問題,下面講講原理:
客戶端發到服務器的數據需要在客戶端進行編碼,類似于:String parameterName = "中國".getBytes("UTF-8")
然后將編碼后的數據發到服務器。
客戶端接受數據,request.getParameter(“”)的作用就是對接收到的數據進行解碼,默認使用ISO-8859-1進行解碼,可以使用request.setCharacterEncoding(“”)進行設置,但僅對post有用。假如我們使用默認的ISO-8859-1,肯定亂碼,因為編碼跟解碼不一致,那此時怎么辦呢,引出了上文中的兩種解決方案:使用request.setCharacterEncoding(“”)改變request.getParameter(“”)的解碼方式或者new String(request.getParameter("parameterName").getBytes("ISO-8859-1"),"charset的值")
將request.getParameter(“”)解碼的數據重新編碼再解碼。
四、其他
在jsp中的頁面使用response.setContentType()等設置字符集會破壞jsp容器自身的頁面編碼,會引起html中字符亂碼,腳本不會亂,所以不建議設置。在開發中多采用page指令設置字符集。
1234567891011121314151617 | <% response.setContentType("text/html;charset=UTF-8"); String str = new String("你好".getBytes("iso-8859-1"),"utf-8");%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><p>你好</p><br><%=str %></body></html> |
網頁測試
*請認真填寫需求信息,我們會在24小時內與您取得聯系。