jsp文件上傳文件名亂碼
A. JSP文件上傳傳過去的名字總是亂碼,代碼如下:
charset=GBK" pageEncoding="UTF-8"%>
pageEncoding是jsp文件本身的編碼
contentType的charset是指伺服器發送給客戶端時的內容編碼
JSP要經過兩次的「編碼」,第一階段會用pageEncoding,第二階段會用utf-8至utf-8,第三階段就是由Tomcat出來的網頁, 用的是contentType。
第一階段是jsp編譯成.java,它會根據pageEncoding的設定讀取jsp,結果是由指定的編碼方案翻譯成統一的UTF-8 JAVA源碼(即.java),如果pageEncoding設定錯了,或沒有設定,出來的就是中文亂碼。
第二階段是由JAVAC的JAVA源碼至java byteCode的編譯,不論JSP編寫時候用的是什麼編碼方案,經過這個階段的結果全部是UTF-8的encoding的java源碼。
B. 為什麼上傳文件的文件名變成亂碼
對於正常的文件在上傳後,文件名不會有變化。
對於鏈接文件,在上傳後,系統上傳的是鏈接的目的文件,所以文件名有變化。對於鏈接文件,如果是鏈接到本地的文件,則實際上傳的是鏈接到的具體文件,文件名也是那個文件名;如果是鏈接到一個網頁,則實際上傳的就是那個網頁,文件名則是網址了。
對於出現的所謂的亂碼,其實就是那個網頁的實際網址。所以建議不要上傳鏈接文件。
C. jsp高手請進,我用jspsmartupload上傳文件,但我表單獲得的中文是亂碼(UTF-8)的,如何解決
以下,是中文亂碼的各種解決方法,要記住了,很有用,肯定有一種方法能幫你解決的。希望能幫到你。
URIENcoding 設成GBK或GB2312
2. 表單中或傳遞字元串:本來輸入的漢字是正常的,但是提交後再顯示出來是亂碼,因為提交的一般是 ISO8859編碼,所以顯示的時候要轉成GB2312編碼:
String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1");
//rs.getString("news")為待轉換的字元串
然後使用S字元串的值就可以了
3. 有的伺服器端的語言環境如果設成簡體中文的也可以解決此類問題
4. 插入資料庫中的字元是亂碼
看看資料庫中支持的是何種編碼方式,用類似2中的方式作一下轉換即可。
5. 總之,用jsp開發,碰到亂碼,你得分析是讀的時候發生亂碼,還是寫的時候發生亂碼,用2中的轉換,基本就能解決問題,有些時候寫的時候做一次轉換,例如:
String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1");
//讀的時候在轉換回來
String S=new String(rs.getString("news").getBytes("ISO8859_1"),"GB2312");
或者把ISO8859-1和GB2312 的位置換一下,自己多試試,就能找到解決問題的辦法。
將亂碼問題分為三類JSP頁面顯示中文亂碼;表單提交亂碼;資料庫應用亂碼
1) JSP頁面內輸出中文時出現亂碼
解決方案在JSP文件中使用page命令指定響應結果的MIME類型,如<%@ page language="java" contentType="text/html;charset=gb2312" %>
2)表單提交亂碼
表單提交時(post和Get方法),使用request.getParameter方法得到亂碼,這是因為tomcat處理提交的參數時默認的是iso-8859-1,表單提交get和post處理亂碼問題不同,下面分別說明。
(1)POST處理
對post提交的表單通過編寫一個過濾器的方法來解決,過濾器在用戶提交的數據被處理之前被調用,可以在這里改變參數的編碼方式,過濾器的代碼如下:
package cn.gov.beijingit.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class SetCharacterEncodingFilter implements Filter {
/**
* The default character encoding to set for requests that pass through this
* filter.
*/
protected String encoding = null;
/**
* The filter configuration object we are associated with. If this value is
* null, this filter instance is not currently configured.
*/
protected FilterConfig filterConfig = null;
/**
* Should a character encoding specified by the client be ignored?
*/
protected boolean ignore = true;
// --------------------------------------------------------- Public Methods
/**
* Take this filter out of service.
*/
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null) {
request.setCharacterEncoding(encoding);
}
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
/**
* Place this filter into service.
*
* @param filterConfig
* The filter configuration object
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null) {
this.ignore = true;
} else if (value.equalsIgnoreCase("true")) {
this.ignore = true;
} else if (value.equalsIgnoreCase("yes")) {
this.ignore = true;
} else {
this.ignore = false;
}
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
web.xml文件加入過濾器
<filter>
<filter-name>Encoding</filter-name>
<filter-class>
cn.gov.beijingit.util.SetCharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gbk</param-value>
<!--gbk或者gb2312或者utf-8-->
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
* 注意filter元素要放在所有web.xml元素之前。
(2) Get方法的處理
tomcat對post和get的處理方法不一樣,所以過濾器不能解決get的亂碼問題,它需要在其他地方設置。
打開<tomcat_home>\conf目錄下server.xml文件,找到對8080埠進行服務的Connector組件的設置部分,給這個組件添加一個屬性:URIEncoding="GBK"。修改後的Connector設置為:
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />
* 注意修改後重新啟動tomcat才能起作用。
3)資料庫應用的亂碼,本文還是以mysql為例
(1)修改配置文件<mysql_home>\my.init
將default-character-set=latin1修改為default-character-set=gbk
(2) 對接受的中文字元重新編碼,例
String name=requset.getParameter("name");
name = new String(name.getBytes("gbk"),"iso8859-1");
4)tomcat5.x的include頁面亂碼
為了能讓tomcat5.x能像tomcat4那樣處理include頁面,需要修改項目web-info/web.xml文件,把默認的字元集設置成gbk/gb2312就可以了,如:
<jsp-config>
<jsp-property-group>
<description>Special property group for JSP Configuration JSP example.</description>
<display-name>JSPConfiguration</display-name>
D. 為什麼jsp文件在本地是好的,上傳到FTB發布在網上就出現中文亂碼
1、JSP頁面亂碼
這種亂碼的原因是應為沒有在頁面里指定使用的字元集編碼,解決方法:只要在頁面開始地方用下面代碼指定字元集編碼即可,
<%@ page contentType="text/html;charset=utf-8" language="java" %>
2、資料庫亂碼
這種亂碼會使你插入資料庫的中文變成亂碼,或者讀出顯示時也是亂碼,解決方法如下:
在資料庫連接字元串中加入編碼字元集
String Url="jdbc:mysql://localhost/digitgulf?user=root&password=root&useUnicode=true&characterEncoding=GB2312";
並在頁面中使用如下代碼:
response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("gb2312");
3、中文作為參數傳遞亂碼
當我們把一段中文字元作為參數傳遞個另一頁面時,也會出現亂碼情況,解決方法如下:
在參數傳遞時對參數編碼,比如
RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
然後在接收參數頁面使用如下語句接收
keywords=new String(request.getParameter("keywords").getBytes("8859_1"));
希望對你有幫助。
E. jsp+servlet上傳圖片和文字時,中文亂碼
轉碼可以在頁面中或是sevlet以及過濾都可以解決的,下面以頁面和servlet為例:
方法一:設置 request 和 response 的編碼 [ 頁面編碼必須為 u8 ]
request.setCharacterEncoding("UTF-8");//傳值編碼
response.setContentType("text/html;charset=UTF-8");//設置傳輸編碼
方法二:
String str1=傳來的數據。
String ss=new String(str1.getBytes("ISO-8859-1"),"utf-8"); //轉碼UTF8