tomcat文字セットと中国語の文字化けの解決


Java webをやるなら、きっと文字化けの問題にあったと思います。
通常、中国語の参考文献をこのように処理しますか?
フロント:
url=encodeURI(url);
バックグラウンド:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
ページ:UTF-8またはGB 2312を通してコードを設定します。
tomcat:統一UTF-8.
そして配置テストをしたら、文字化けです。どうしてまだ私につきまとっていますか?私は唐僧ではあるまいし、肉はもっとないです。
文字化けの問題は、バグです。臭いバグ!私も何度か会ったことがあります。毎回葛藤しています。毎回は一回の転換を経て、自分と同僚にはっきりと教えます。この文字化けは解決しました。ある日、テスト部がメールでBUGを提出しました。日記はどうして全部文字化けしているかと言いました。この時、同僚たちが私を見に来ました。私は黒い顔をしています。
最近暇ができて、いくつか文章を見て、まとめました。ここではやはり以下の内容が好きです。文字化けの問題はもう根絶したかどうかは分かりませんが、今の2回のテストの過程で、文字化けの姿はもうなくなりました。彼女は本当に消えましたか?分かりません
はい、内容に入りましょう。
==============================================================================================================================
tomcatを使う時、みんなが中国語の文字化けの問題に遭うことを信じて、具体的には1と表現します。フォームで取得した中国語のデータは文字化け2です。ページは中国語のデータを提出して、サーバー側は文字化けと受信します。  一、初級解決方法  検索の結果、取得した文字列をiso 8859-1で復号変換し、gb 2312で符号化し、正しい内容を得る方法が多く採用されました。例のコードは以下の通りです。ページの参照:http://xxx.do?ptname='私は中国人です。
String strPtname = request.getParameter("ptname");
strPtname = new String(strPtname.getBytes("ISO-8859-1"), "UTF-8");
String para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312"); 
具体的な理由は、アメリカ人がtomcatを書く時に、iso 8859-1をデフォルトで使って符号化するからです。 
しかし、私たちのservletとjspページには大量のパラメータが伝達されています。このように変換すると、大量の変換コードがもたらされて、とても不便です。
 
二、入門レベルの解決方法 
その後、フィルタを書き始め、クライアントからのパラメータを取得する前に、フィルタを通してまず取得したパラメータをgb 2312に設定し、直接にgetParameeterを使って正しいパラメータを取得することができます。このフィルタはtomcatのコード例jsp-examplesに詳細な使用例があります。フィルタはweb.xmlに設定されています。例では日本語のコードを使っています。gb 2312に変更すればいいです。 
view plincopy to clipboardprint?
    
Set Character Encoding    
filters.SetCharacterEncodingFilter    
    
encoding    
EUC_JP    
    
   
 
Set Character Encoding 
filters.SetCharacterEncodingFilter 
 
encoding 
EUC_JP 
 
 
 フィルタのコードは以下の通りです。 
public class SetCharacterEncodingFilter implements Filter {    
//           
protected String encoding = null;    
//           
protected FilterConfig filterConfig = null;    
//               
protected boolean ignore = true;    
//          
public void destroy() {    
this.encoding = null;    
this.filterConfig = null;    
}    
//         
public void doFilter(ServletRequest request, ServletResponse response,    
FilterChain chain)    
throws IOException, ServletException {    
//        ,        ,                 
if (ignore || (request.getCharacterEncoding() == null)) {    
String encoding = selectEncoding(request);    
if (encoding != null)    
request.setCharacterEncoding(encoding);    
}    
//              
chain.doFilter(request, response);    
}    
  
//           
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);    
}    
}   
public class SetCharacterEncodingFilter implements Filter { 
//        
protected String encoding = null; 
//        
protected FilterConfig filterConfig = null; 
//            
protected boolean ignore = true; 
//       
public void destroy() { 
this.encoding = null; 
this.filterConfig = null; 
} 
//      
public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain) 
throws IOException, ServletException { 
//        ,        ,              
if (ignore || (request.getCharacterEncoding() == null)) { 
String encoding = selectEncoding(request); 
if (encoding != null) 
request.setCharacterEncoding(encoding); 
} 
//           
chain.doFilter(request, response); 
}


//        
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); 
} 
} 
 しかし、tomcat 5では、フィルタを使っても文字化けが可能です。なぜですか?
 
三、高級解決方法 
元々、tomcat 4とtomcat 5ではパラメータの処理が違います。
tomcat 4では、getはpostのコードと同じですので、フィルタの中でrequest.set CharcterEncocdingで設定すれば、getとpostの問題が解決できます。
しかし、tomcat 5ではgetとpostの処理は別々に行われています。
tomcat 5では、コーディング問題を解決するために、tomcatの著者が多くの努力をしました。特にtomcatのプロファイルserver.xmlでConnector要素に対して以下のような構成パラメータを追加しました。 
URIEncodingは、URIを介して伝達されるコンテンツ使用の符号化を設定するために使用され、tomcatは、ここで指定された符号化を用いてクライアントから送信されたコンテンツを符号化する。 
URIとは何ですか? 
java docの説明では、URIは統一リソース識別子であり、URLは統一リソースロケータであると説明している。したがって、大まかに言えば、各URLはURIであるが、必ずしも各URIがURLであるとは限らない。これはURIにはまた、リソースの名前が付けられているが、リソースの位置を指定しないサブクラスが含まれているからである。
 
つまり、私たちがpostメソッドで提出したパラメータは、実際にはuriによって提出され、このパラメータで管理されています。もしこのパラメータが設定されていないなら、tomcatはデフォルトのiso 8859-1を使ってクライアントの内容をエンコードします。
 
URIはBodyと同様の符号化で処理されますが、この設定はtomcat 4との互換性を保つためです。tomcat 5では、postに対して の処理は前のURIEncodingによって処理され、getの内容は相変わらずrequest.set CharcterEnccodingによって処理され、互換性を保つためにこの設定がなされています。 
useBody Enco ForURIを本当に設定すると、request.set CharcterEncocdingを通じてgetとpostの文字化け問題を直接解決できます。 
このように,server.xmlにURIEncodingを設定することにより,get法におけるパラメータ問題を解決し,フィルタを用いてpost法における問題を解決することができる。 
あるいは、server.xmlにuseBody EcodingForURIをtrueに設定することによって、フィルタを組み合わせて符号化の問題を解決することもできます。 
ここでは、私はウェブサイトの創作過程において、全行程でutf-8コードを使って徹底的に文字化け問題を解決することを強く提案します。 
具体的な操作は以下の通りです。 
1、ページの内容はutf-8形式で保存し、ページに追加します。  2、サーバー側のserver.xmlにuseBody Enco ForURI=trueを設定します。  3、フィルタを使って、フィルタ設定をutf-8に符号化します。
いくつかのトランスコードがあっても回らないなら、tomcatのserver.xmlを開けてみてください。見つけられます。
 
と最後にuseBody EnccodingForURI="true"URIEncoding="UTF-8"を追加しました。
 5:
JSTLを使えば、自分で一つのelのfunctionを書いて、URLEncoder.encodeを呼び出して符号化することができます。
IEデフォルトではURLの後ろのパラメータは符号化されて送信されませんが、tomatデフォルトではISO 8859-1でURL復号されていますので、上記のエラーが発生します。はい、そうです
1、URLパラメータの中でUTF-8で符号化されることを確保し、方法はjs関数encodeURI()を使用したり、カスタムのel functionを呼び出したりすることができる。
2、server.xmlのConnectorを設定し、URIEncoding=「UTF-8」を熟知しており、復号フォーマットと符号化フォーマットが統一されることを確保する。
方法四:
  
 actionで:
String s=request.getParameter("s");
s=new String(s.getBytes("iso-8859-1"),"gbk");
六:jsの文字化け解決1.クライアント:
url=encodeURI(url);
サーバ:
String linename = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
2.クライアント:
url=encodeURI(encodeURI(url)); //  2 encodeURI 
これは、比較的に推奨されているやり方です。なぜこのようにしたのですか?理由があります。後で整理して貼り付けます。
サーバ:
String linename = request.getParameter(name);
//java : 文字の復号
linename = java.net.URLDecoder.decode(linename , "UTF-8");