2012-10-04 35 views
22

我有一個JSP頁面,其頁面編碼爲ISO-8859-1。此JSP頁面位於問題答案博客中。我希望在Q/A發佈期間包含特殊字符。JSP頁面中的UTF-8編碼

問題是JSP不支持UTF-8編碼,即使我已將其從ISO-8859-1更改爲UTF-8。這些字符(~,%,&,+)出現問題。當我單獨發佈這些字符或與任何字符的組合發佈這些字符時,storinh null在數據庫中,當我在發佈應用程序時刪除這些字符時它工作正常。

任何人都可以提出一些解決方案嗎?

+0

表演,請接收數據的代碼,如何你把它存儲到數據庫,你如何將它從數據庫中顯示到jsp – MaVRoSCy

+0

這是一個很長的代碼,我不能粘貼在這裏,但我可以告訴你的流量。用戶發佈來自jsp頁面(a.jsp)的問題的答案。我將所有的值傳遞給tester.js文件(提交時),然後這些值將隱藏jsp頁面,然後我調用java方法來發布數據。如果用戶正在發佈(&&&&&&&),那麼值將到達tester.js文件,但在將值發送到隱藏的jsp頁面後,所有值都將變爲null(僅在上面描述特殊字符休息的情況下才能正常工作)。 – Shailendra

+0

請發送tester.js的方法來處理提交 – MaVRoSCy

回答

4

你必須確保該文件被保存 UTF-8編碼。 你可以用幾個純文本編輯器來做到這一點。使用Notepad ++,即可以在菜單Encoding - >Encode in UTF-8中進行選擇。即使使用Windows'記事本(Save As - >編碼UTF-8),您也可以做到這一點。 如果您使用的是Eclipse,您可以在文件的屬性中進行設置。

另外,檢查問題是否是你必須轉義這些字符。你的問題並不奇怪,因爲其中一個字符是&

48

您應該使用相同的編碼應用程序的所有層以避免此問題。它是有用的添加filter設置編碼:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
throws ServletException 
{ 
    request.setCharacterEncoding("UTF-8"); 
    chain.doFilter(request, response); 
} 

要只設置編碼在JSP頁面中,該行添加到他們:

<%@ page contentType="text/html; charset=UTF-8" %> 

配置數據庫使用相同的字符編碼也是如此。

如果你需要轉換字符串的編碼見:

我不會推薦給HTML編碼的文本存儲在數據庫中。例如,如果您需要生成PDF(或HTML以外的其他文件),則需要先轉換HTML編碼。

+0

你能解釋一點點,因爲我是這個問題的新手。 喜歡在哪裏添加過濾器。 – Shailendra

+0

有關詳細信息和示例,請參閱http://stackoverflow.com/tags/servlet-filters/info –

3

這是一個常見問題。

要解決的一個最簡單的方法是檢查特殊字符是否到達動作層內部,然後修改java代碼中的特殊字符。

如果您可以查看在行動或這種性格你的選擇(如商業層)的任何其他Java層,只要用相應的使用StringEscapeUtils.html#escapeHtml

做後逃逸HTML字符替換的字符。使用新字符串保存到數據庫。

+0

以及我得到你的soloution,但我無法獲得業務層本身的特殊字符。在進入java類之前,它在jsp中迷路了。 – Shailendra

+0

@ShailendraDubey嗯日期應該是在形式和到達行動層,你可以仔細檢查。如果它不來,你可以把代碼或一些示例代碼的一些細節(不包括整個JSP)。 –

24

完整的JSP標籤應該是這樣的,介意的pageEncoding太:與編碼

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

一些舊的瀏覽器搞亂了。您可以使用HTML標籤

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

而且該文件應該被記錄在UTF-8格式,如果你使用的是Eclipse上的文件 - >屬性 - >查看左鍵單擊 - >文本文件編碼。

+1

」就足夠了。 – Timo

+0

並非在所有情況下。防爆。如果你的項目默認不是UTF-8。 [doc here](http://docs.oracle.com/cd/B14099_19/web.1012/b14014/jspnls.htm#i1005593) – PbxMan

+1

pageEncoding爲我做了。 meta標籤本身沒有。 – Thomas

4

這個線程可以幫助您: Passing request parameters as UTF-8 encoded strings

基本上是:

request.setCharacterEncoding("UTF-8"); 
String login = request.getParameter("login"); 
String password = request.getParameter("password"); 

或者你在JSP文件中使用JavaScript:

var userInput = $("#myInput").val();    
var encodedUserInput = encodeURIComponent(userInput); 
$("#hiddenImput").val(encodedUserInput); 

,並在課後恢復:

String parameter = URLDecoder.decode(request.getParameter("hiddenImput"), "UTF-8"); 
+0

此外,我在server.xml的標記_ _中添加了參數_URIEncoding =「UTF-8」_(在我的情況下,我使用Apache Tomcat) – dellasavia

+0

此解決方案很好,但您可以在web中添加全局配置。 xml通過添加CharacterEncodingFilter,只需按照此鏈接[https://stackoverflow.com/a/30276333](https://stackoverflow.com/a/30276333) –

10

我還有一個問題顯示像「ṀŮ」的charectors。我在web.xml中添加了以下內容。

<jsp-config> 
    <jsp-property-group> 
     <url-pattern>*.jsp</url-pattern> 
     <page-encoding>UTF-8</page-encoding> 
    </jsp-property-group> 
</jsp-config> 

這解決了頁面中除header以外的問題。試過很多方法來解決這個問題,沒有任何工作在我的情況。標題問題是從另一個jsp中包含標題jsp頁面。所以給編碼輸入,並解決了我的問題。

<c:import url="/Header1.jsp" charEncoding="UTF-8"/> 

感謝

+0

感謝您的這種提示。這也是需要的,似乎避免在每個jsp文件中寫入<%@ page pageEncoding =「UTF-8」%>(在我的情況下,只有在兩次重新啓動Tomcat和Browser-緩存而不是直接...) – leole

0

我不得不使用特殊字符作爲分隔符JSP同樣的問題。當特殊字符發佈到servlet時,他們都搞砸了。我用下面的轉換來解決這個問題:

String str = new String (request.getParameter("string").getBytes ("iso-8859-1"), "UTF-8"); 
0

我添加這個shell腳本轉換JSP文件從IS

#!/bin/sh 

############################################### 
## this script file must be placed in the parent 
## folder of the to folders "in" and "out" 
## in contain the input jsp files 
## out will containt the generated jsp files 
## 
############################################### 

find in/ -name *.jsp | 
    while read line; do 
     outpath=`echo $line | sed -e 's/in/out/'` ; 
     parentdir=`echo $outpath | sed -e 's/[^\/]*\.jsp$//'` ; 
     mkdir -p $parentdir 
     echo $outpath ; 
     iconv -t UTF-8 -f ISO-8859-1 -o $outpath $line ; 
    done 
3

我使用的編碼過濾器,解決了我所有的編碼問題...

package com.dina.filter; 

    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; 

    /** 
    * 
    * @author DINANATH 
    */ 
    public class EncodingFilter implements Filter { 

     private String encoding = "utf-8"; 

     public void doFilter(ServletRequest request,ServletResponse response, FilterChain filterChain) throws IOException, ServletException { 
      request.setCharacterEncoding(encoding); 
    //    response.setContentType("text/html;charset=UTF-8"); 
        response.setCharacterEncoding(encoding); 
      filterChain.doFilter(request, response); 

     } 

     public void init(FilterConfig filterConfig) throws ServletException { 
      String encodingParam = filterConfig.getInitParameter("encoding"); 
      if (encodingParam != null) { 
       encoding = encodingParam; 
      } 
     } 

     public void destroy() { 
      // nothing todo 
     } 

    } 

在web.xml

<filter> 
     <filter-name>EncodingFilter</filter-name> 
     <filter-class> 
     com.dina.filter.EncodingFilter 
     </filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>EncodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
0

感謝您的所有提示。使用Tomcat8我還添加了一個像@Jasper de Vries所寫的過濾器。但在現在的新Tomcats中,已經實現了一個過濾器,可以在Tomcat Web中使用resp。xml:

<filter> 
    <filter-name>setCharacterEncodingFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <async-supported>true</async-supported> 
</filter> 
... 
<filter-mapping> 
    <filter-name>setCharacterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

和所有其他人一樣發佈;我將URIEncoding="UTF-8"添加到Apache中的Tomcat連接器。這也有幫助。

重要的是說,那Eclipse的(如果你用這個)有它的web.xml的副本,並覆蓋Tomcat的設置,因爲它是在這裏解釋:Broken UTF-8 URI Encoding in JSPs