JAvaでは中国語の文字化けしを徹底的に解決

11989 ワード

まず、文字化けしが発生したいくつかの状況を分析します.
  • データページに文字化けが表示される
  • データはサーバーに着いた後に文字化けしがあります
  • サーバから返されたスクランブル
  • Ajaxで送受信時に文字化けしがある
  • データがページに文字化けしている
    つまり、サーバがデータを取得する際に問題がなく、クライアントにデータが文字化けして表示される場合は、ページの符号化を変更するだけで済むことが望ましい.
    pageEncoding="utf-8"

    データはサーバーに着いた後に文字化けしがあります
    通常、フォームにデータがサーバに提出され、サーバが取得する際に得られるのは文字化けであり、Tomcatを例にとると、サーバにどのような符号化でデータを取得するかを教えていないため、ページがutf-8の符号化で表示されているデータであると仮定すると、あなたが記入する際に問題なく、問題がないように見えますが、コンピュータは0と1しか認識していません.それは伝送の過程でバイナリの様式でサーバーに入ったので、この時あなたのサーバーはそれが前に何の符号化だったのか分からないで、もしあなたが指定していないならば、それは外国人の好みに従って、iso 8859-1の符号化で読み取って、結果は文字化を乱しました.
    この場合の解決方法は、POSTとGET方式に分けられ、POSTソリューションは簡単で、取得時に文字化けがある以上、取得前に符号化を設定すればよい.
    request.setCharacterEncoding("utf-8");
    次に、従来の方法を使用して取得します.
    String value = request.getParameter("value");
    なお、このような設定はPOSTコミットにのみ有効である、GETであれば比較的面倒である.乱符号化はメソッドgetParameter()を呼び出すときに発生するため、メソッド内部の符号化に問題が発生するに違いありません.UTF-8を自動的に使用できない以上、手動で回転します.
    if(request.getMethod().equalsIgnoreCase("get")){
    value = new String(value.getBytes("iso8859-1"),"utf-8");
    }
    POSTの提出方式が解決したので、提出方式がGETである場合にのみ処理する必要がある.これにより、サーバが取得したデータが文字化けしていないことを保証できます.
    サーバから返される文字化けし
    通常はresponseの符号化を設定するだけです.
    response.setCharacterEncoding("utf-8");
    次にブラウザのエンコードをUTF-8に設定します
    あるいはブラウザにUTF-8のエンコードで開くように通知する
    response.setContentType("text/html;charset=utf-8");
    これにより、ブラウザが受け取るUTF-8のデータが保証され、表示に問題がない.
    Ajaxを使って送受信する時文字化けしがあります
    AjaxまたはJavaScriptで提出するフォームであれば、getで渡す中国語を符号化する必要がある.JSの内蔵関数encodeURI()を用いる、この関数はURI文字列をUTF-8符号化形式でescape形式の文字列に変換し、この関数を用いなければブラウザによってデフォルトの符号化を行うが、これは予測できない行為である.要するに、上記の問題が解決すれば、Ajaxも静かになります.
    また、データを取得する際、サーバ側のプログラムごとにPOST,GETに対して設定が必要であり、同じ書き方であると、あまりにも優雅ではないので、最後にすべてのページに対するrequestとresponseの設定を1つのフィルタで置き換える.では、フィルタの中でrequestまたはresponseオブジェクトを強化し、強化後のrequestまたはresponseを放行する必要があります.サーバプログラムでは、文字化けを解決するコードを書く必要がなく、プログラムのメンテナンス性を高めることができます.
    クラスを強化するには、次の3つの方法があります.
  • は、クラス
  • を直接継承する.
  • 包装設計モード
  • 動的エージェント
  • 明らかに、ここでは継承には適していない.最も簡単であるが、1つのrequestオブジェクトには多くのデータが含まれている.requestオブジェクトを作成するには、requestがどのように生成されたのかを知ってから、サーバでrequestオブジェクトを作成する方法で私の「MyRequest」オブジェクトを作成し、強化の目的を達成しなければならない.だからここでこの方法を放棄します.
    フィルター+包装類
    public class CharacterFilter implements Filter {
        
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            //POST       
            request.setCharacterEncoding("utf-8");
            
            //           
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            
            //         
            MyRequest myRequest = new MyRequest(request);
            chain.doFilter(myRequest, response);    //    ,                      
        }
        /**    request      :
             1.     ,             
             2.         ,       
             3.           ,       
             4.         
             5.         ,         (    )   
               "   "
         */
        class MyRequest extends HttpServletRequestWrapper{
            private HttpServletRequest request;
            public MyRequest(HttpServletRequest request) {
                super(request);
                this.request = request;
            }
            @Override
            public String getParameter(String name) {
                //       POST,     ,           
                if(this.request.getMethod().equalsIgnoreCase("POST")){
                    return this.request.getParameter(name);
                }
                /*      ,       GET
                    ,       */
                String value = this.request.getParameter(name);
                try {
                    value = new String(value.getBytes("iso8859-1"),"utf-8");
                } catch (UnsupportedEncodingException e) {
                    throw new RuntimeException(e);
                }
                return value;        //  
            }
        }
        
        public void destroy() {
            // TODO Auto-generated method stub
        }
        public void init(FilterConfig fConfig) throws ServletException {
            // TODO Auto-generated method stub
        }
    } 

    フィルタはwebに覚えています.xmlに1本配置
    フィルタ+ダイナミックエージェント
    public class CharacterFilter2 implements Filter {
        
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            final HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            //POST       
            request.setCharacterEncoding("utf-8");
            
            //           
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            
            //       ,  getParameter() ,  
            chain.doFilter((ServletRequest) Proxy.newProxyInstance(CharacterFilter2.class.getClassLoader(), request.getClass().getInterfaces(), 
                    new InvocationHandler(){ //      
                @Override
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                    //       POST,     ,           
                    if(request.getMethod().equalsIgnoreCase("POST")){
                        return method.invoke(request, args);
                    }
                    String methodName = method.getName();
                    //           getParameter(),     
                    if(!methodName.equals("getParameter")){
                        return method.invoke(request, args);
                    }
                    // GET,   getParameter(),...
                    String value = (String) method.invoke(request, args);
                    if(value!=null){
                        value = new String(value.getBytes("iso8859-1"),"utf-8");
                    }
                    return value;
                }
            }), response);
        }
        
        public void destroy() {
            // TODO Auto-generated method stub
        }
        public void init(FilterConfig fConfig) throws ServletException {
            // TODO Auto-generated method stub
        }
    }