formフォームコミット符号化の紹介

4105 ワード

Javaのweb開発をしてしばらく経って、ある問題はいつも私を困らせて、文字化けの問題です.基本的にはネットで解決策を探しています(ネット上の資料は本当に多いです)、このような文字化けの問題をどのように解決するかをたくさん紹介していますが、問題のいきさつをはっきり言っていません.時には文章を見て、自分が知っていると思っていましたが、開発中に文字化けの問題が幽霊のように出てきてびっくりしました.本当に頭が大きいですね.この文章は私が長い間文字化けと戦っていた理解の積み重ねです.疲れて、もっと多くの友达が指摘して補充することを望んでいます.formは2つの方法でデータをサーバに提出し、getとpostを別々に話しましょう.(一)getコミット1.まずクライアント(ブラウザ)のformフォームをgetメソッドでデータをエンコードしてサーバ側にコミットする方法について述べる.getメソッドでは,要求されたurlの後ろにデータを直列にパラメータとして接続する.http://localhost:8080/servlet?msg=abc(urlに中国語や他の特殊文字が表示された場合、次のような文字化けの問題が発生します.http://localhost:8080/servlet?msg=杭州、サーバー側は文字化けしやすい)、urlのつなぎ合わせが完了すると、ブラウザはurlに対してURL encodeを行い、サーバーに送信します.URL encodeの過程はurlの一部を文字にすることです.ある種の符号化方式(utf-8,gbkなど)に従ってバイナリのバイトコードに符号化され、各バイトは3文字を含む文字列「%xy」で符号化される.は、xyがバイトの2桁の16進数表現形式であることを示します.私がここで言ったことははっきりしないかもしれませんが、具体的な紹介はjavaを見ることができます.net.URLEncoderクラスの紹介はこちらです.URL encodeのプロセスを理解すると、2つの重要な問題を見ることができます.第一に、URL encodeを必要とする文字は一般的に非ASCIIの文字(大まかに言えば)であり、さらに一般的に言えば英字以外の文字である(例えば:中国語、日本語など)URL encodeを行うので、私たちにとって、すべて英語のアルファベットのurlはサーバーが文字化けして問題を得ることができなくて、文字化けしてすべてurlの中で中国語あるいは特殊な文字を持ってきたのです;第2:URL encodeはいったいあのような符号化の方式によって文字化に対して?ここはブラウザの事で、その上異なるブラウザはありません同じやり方で、中国語版のブラウザは一般的にデフォルトでGBKを使用しています.ブラウザを設定することでUTF-8を使用することもできます.ユーザーによってブラウザの設定が異なる可能性があります.また、異なる符号化方式をもたらす可能性があります.そのため、urlの中の中国語や特殊文字をjavascriptでURL encodeを作ってから、urlをつなぎ合わせてデータを提出することが多いです.つまりブラウザの代わりにURL encodeを作って、メリットはウェブサイトがgetメソッドを統一してデータを提出できる符号化方式です.URL encodeが完了すると、現在のurlはASCII範囲内の文字になり、iso-8859-1の符号化方式でバイナリに変換されてリクエストヘッダとともに送信される.ここでもっと言いたいのは、getメソッドにとって、リクエストエンティティがなく、データを含むurlがリクエストヘッダの中にあるのは、URL encodeを使うのは、リクエストヘッダにとって最終的にiso-8859-1符号化方式でバイナリに符号化される101010になるからだと思います.の純データはインターネット上で配信され、中国語などの特殊文字をそのままiso-8859-1符号化すると情報が失われるので、URL encodeを先に作る必要があります.   2.サーバ側(tomcat)どのようにデータを取得して復号するか.第一歩はまずiso-8859-1でデータを復号することである.getメソッドにとってtomcatがデータを取得するのはASCIIの範囲内の要求ヘッダ文字であり、その中の要求urlにはパラメータデータが含まれており、パラメータに中国語などの特殊文字があれば、現在はURL encode後の%XY状態であり、先に停止し、私はまず、開発者が一般的にデータを取得する過程についてお話しします.普通はみんなrequestです.getParameter(「name」)はパラメータデータを取得し、我々がrequestオブジェクトまたは得たデータはすべて復号されたものであり、復号中にプログラムでは指定できないが、ここではrequestを使用する初心者が多い.setCharacterEncoding(「文字セット」)は復号方式を指定することができるが、実際には不可能であり、servletの公式APIを見ると、この方法の解釈がある:Overrides the name of the character encoding used in the body of this request.This method must be called prior to reading request parameters or reading input using getReader().getメソッドに対して彼はどうしようもないことがわかる.では、いったいどのような符号化方式でデータを復号するのか、これはtomcatのことです.デフォルトではiso-8859-1が使われています.これにより、get要求に中国語のパラメータがあるのに、なぜサーバー側で乱符号化されたのかを見つけることができます.クライアントではUTF-8やGBKでデータURL encodeを使用するのが一般的です.ここではiso-8859-1方式のURL decoderでは明らかにできません.プログラムでは直接
Javaコード
  • new  String(request.getParameter( "name").getBytes(「iso-8859-1」)、「クライアント指定URL encode符号化方式」)
  • new String(request.getParameter("name").getBytes("iso-8859-1"),"      URL encode    ")
    

    バイトコードを復元して、正しい方法でデータを復号して、ネット上の文章は通常tomcatの中で配置します
    Xmlコード
  • < Connector   port = "8080"  protocol = "HTTP/1.1"  maxThreads = "150"  connectionTimeout = "20000"  redirectPort = "8443"  URIEncoding = "GBK"/>   
  • 
    

    これはtomcatがデータを取得した後に指定の方式URL decoderで、URL decoderの紹介ここ(一)post提出1.クライアント(ブラウザ)のformフォームはpostメソッドでどのようにデータをエンコードしてサーバ側に提出しているのか.postメソッドで転送するデータもURL encodeが必要ですが、彼はどんなエンコード方式を使っているのでしょうか.formがあるhtmlファイルにセグメントがあれば、postはここで指定したエンコード方式でエンコードされます.一般的にこのコードはブラウザはどの文字セットでWebページを解釈するかを知っているので、htmlコードの最前端に置いて、できるだけ文字化けしないようにします.実はformフォームのpostメソッドを指定してデータを提出するURL encode符号化方式もあります.ここから,getメソッドの数に対して,ブラウザによるデータのURL encodeの符号化方式はブラウザ設定によって決定されることが分かる.(jsで統一指定できます)、postメソッドでは、開発者が指定できます.2.サーバ側(tomcat)はどのようにデータを取得して復号しますか.tomcatでデフォルト設定をデフォルト設定してもフィルタなどの符号化設定もしていない場合はiso-8859-1で復号しますが、request.setCharacterEncoding(「文字セット」)は役に立ちます.上記tomcatが行ったことは、要求ヘッダに符号化方式が指定されていないことが前提であり、要求ヘッダに符号化方式が指定されている場合、このように符号化されることに気づいた.2つの文章の推薦の下で、住所はそれぞれhttp://www.cnblogs.com/yencain/articles/1321386.html ; http://wanghuan8086.javaeye.com/blog/173869