JAva開発におけるフロントからバックグラウンドへの中国語の文字化けしの解決方法

4824 ワード

Javawebでは、jspからバックグラウンドにパラメータをコミットすることがよくありますが、パラメータに中国語があれば、バックグラウンド用のservlet、struts 2、またはspringmvcにかかわらず、文字化けが発生する場合があります.私はこの問題を解決する3つの方法をまとめた.

1:
バックグラウンドで値を取得した後、バックグラウンドに渡されるパラメータtitleが中国語であるなど、値を再符号化します.
バックグラウンドでこのパラメータを受信するには、次の手順に従います.
String title=request.getParameter("title");

トランスコード:
String titlenew=new String(title.trim().getBytes("ISO-8859-1"), "UTF-8"); 

2:
JAvascriptのurlencode()関数は、文字列をURIとして符号化(ASCIIアルファベットや数字は符号化されず、これらのASCII句読点も符号化されない:-.!~*'())、非英語文字を英語符号化に変換することができます.
urlschool = appPath+"/recruit/recruit_viewInfoList.do?page="+page+"&rows=8&abstr=0"+"&categoryId=40941992905003505418"+"&title="+positionschool;
$.getJSON(encodeURI(urlschool),function(data){
//
             }

バックグラウンドでjavaを使います.net.URLDecoder.decode()関数を復号する
conferenceSign.setParticipants_name(java.net.URLDecoder.decode(title,"UTF-8"));

しかし、上記の2つの方法は、毎回再符号化、復号化を行うのが面倒なので、3つ目の方法を紹介します
3:
ブロッキングを使用します(ブロッキングの原理はあまり説明しません)、コードは以下の通りです.
    
public class SetCharactorEncoding implements Filter{

	String encoding=null;
	@Override
	public void destroy() {
		encoding=null;
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		if(encoding!=null){                                                                           //          
			request.setCharacterEncoding(encoding);                                  //  request     
			response.setContentType("text/html;charset="+encoding);     //  response     
			HttpServletRequest req = (HttpServletRequest)request; 
			
			chain.doFilter(req, response);                                                    //         
		}
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		encoding=filterConfig.getInitParameter("encoding");                    //       
		
	}

多くの盆友はこれが万事大勝だと思っているかもしれません.no,no,no.
心ある盆友は、get方式でリクエストを提出すると、ブロックが機能しないことに気づくかもしれません.なぜですか.post方式パラメータは要求パケットのメッセージボディに格納されるからである.get方式パラメータは、要求パケットの要求行のURIフィールドに格納されます.URIフィールドの後にparam=value¶me 2=value 2として添付し始めます.そしてrequest.setCharacterEncoding(charset); メッセージボディのデータのみに作用し、URIフィールドのパラメータには作用しないので、上のブロッキングは強化する必要があります.
        
public class SetCharactorEncoding implements Filter{

	String encoding=null;
	@Override
	public void destroy() {
		encoding=null;
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		if(encoding!=null){                                                                           //          
			request.setCharacterEncoding(encoding);                                  //  request     
			response.setContentType("text/html;charset="+encoding);     //  response     
			HttpServletRequest req = (HttpServletRequest)request; 
			if(req.getMethod().equalsIgnoreCase("get")){                             //   get         
		
				req=new GetHttpServletRequestWrapper(req,encoding);
			}
			chain.doFilter(req, response);                                                    //         
		}
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		encoding=filterConfig.getInitParameter("encoding");                    //       
		
	}

        
getリクエストであればhttpServertRequestパッケージインタフェースH ttpServertRequestWrapperを書き換えることでurlのパラメータを変更する必要があると判断しました
public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper  {

	  private String charset = "UTF-8";                                                                       //   charset 
	  public GetHttpServletRequestWrapper(HttpServletRequest request) {  
		   super(request);  
      }  

	
	public GetHttpServletRequestWrapper(HttpServletRequest request,String charset) {
		super(request);
		this.charset = charset;
	}
	

	/** 
	   *                 getParameter      ,          
	   */  
	   public String getParameter(String name) {  
           String value = super.getParameter(name);  
	       value = value == null ? null : convert(value);  
	       return value;  
	   }  

	public String convert(String target) {  
	    System.out.println("      :" + target);  
        try {  
            return new String(target.trim().getBytes("ISO-8859-1"), charset);  
	    } catch (UnsupportedEncodingException e) {  
           return target;  
          }  
	}
のような比較的完全な中国語の文字化けしを解決する構想が出てきました.皆さんの補充を歓迎します.