springmvc controllerとservlet中国語の文字化け問題

3364 ワード

一、第一の方法はtomcat配置とspring符号化フィルタによって中国語の文字化けを解決する。
1、tomcatプロファイルserver.xmlを変更する
 
  tomcat  conf/server.xml  
      :    
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
       Tomcat  HTTP         。
           :URIEncoding,        UTF-8,   Tomcat(  ISO-8859-1  ) UTF-8     get  。
     :
<Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
 2、spring符号化フィルタは、web.xmlに符号化フィルタを配置する。
 
<filter>
	<filter-name>encodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</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>
<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>*.jsp</url-pattern>
</filter-mapping>
 
二番目の方法。上の配置を使って問題を解決できます。ただし、springmvcを使用していないと、エンコードフィルタが使えなくなり、それぞれrequestとレスポンスが処理されます。
 
servletあるいはspringmvcのrequestとreponseの文字化けの問題
1、requestはurlを使って中国語パラメータ(http getなど)の文字化け問題を伝えます。
//1、type     ,           。  tomcat  iso-8859-1    ,        。
String type = request.getParameter(Params.TYPE);

//2、 type  utf8    : iso-88590-1        utf-8    
res = new String(type.getBytes("iso-8859-1"),"UTF-8");
 
2、レスポンス   中国語文字列の文字化けを出力します。
第一の方法:
//getWriter()           iso-8859-1,    utf8         
PrintWriter pw = response.getWriter();
//1、			
//response.setCharacterEncoding("UTF-8");
//2、
response.setContentType("text/html; charset=utf-8");
			pw.write(resStr);
			pw.flush();
			pw.close();

setContentType   setCharacterEncoding      characterEncoding           ,       。        ,  response.setContentType("text/html; charset=utf-8");      。
 第二の方法:
 PrintWriter out =  new PrintWriter(new OutputStreamWriter(new FileOutputStream(), "UTF-8"));
 
 
まとめ:
1.servletで中国語を出力し、PrintWriter方式を採用するなら、get PrintWriter()を呼び出す前にsetContentTypeまたはset CharcterEncocdingを呼び出す必要があります。ServletOutputStream方式を採用していますが、この限りではありません。
 
2.setContentTypeとset CharcterEnccodingの2つの方法において、characterEnccodingを設定する方法はサーバの効果に一致しています。繰り返し起動する必要はありません。テキストの内容を出力する時は、レスポンス-set ContentType(「text/html」、charset=utf-8)を採用します。もっと便利そうです。
 
3.PrintWriter自身は符号化の職責を処理していません。それはやはり装飾器として見たほうがいいと思います。それは出力が便利であるために設計されたものです。print、printel、printなどの便利な方法を提供します。コードを設定するなら、その下のWriterにセットしてもいいです。
 
new PrintWriter(new Output Stream Writer(new FileOutputStream(「yourfilepath」)、 「UTF-8」)