【回転】formフォーム提出データ符号化方式及びtomcatの受入符号化方式
10034 ワード
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つのとても重要な問題を見ることができて、第1:URL encodeの文字を必要とするのは普通すべてASCIIの文字ではありません(大まかに言えば)、更に通俗的に言えば英語のアルファベット以外の文字(例えば:中国語、日本語など)はすべてURL encodeを行うので、私達にとって、すべて英語のアルファベットのurlはサーバーが文字化けして問題を得ることができなくて、文字化けしてすべてurlの中で中国語あるいは特殊な文字を持ってきたのです;第二:URL encodeはいったいそのような符号化方式で文字を符号化しますか?ここでブラウザのことですが、ブラウザによってやり方が異なります.post方法はまずhttp-equiv="charset" content=「iso-8859-1」>があるかどうかを見て、ない場合は内コードを使います.中国語版のブラウザは一般的にデフォルトでGBKを使用し、ブラウザを設定することでUTF-8を使用することができ、ユーザーによってブラウザの設定が異なる可能性があり、異なる符号化方式をもたらすため、urlの中の中国語や特殊な文字をjavascriptでURL encodeにしてからurlをつなぎ合わせてデータを提出する方法が多い.つまりブラウザの代わりにURL encodeを作って、メリットはウェブサイトがgetメソッドを統一してデータを提出できる符号化方式です.URL encodeが完了すると、現在のurlはASCIIの範囲内の文字になり、iso-8859-1の符号化方式でバイナリに変換されて要求ヘッダとともに送信される(http要求ヘッダはネットワーク上でiso-8859-1の符号化で伝送される固定であり、get/postメソッドのヘッダを求めても同様である).ここでもっと言いたいのは、getメソッドにとって、リクエストエンティティがなく、データを含むurlがリクエストヘッダの中にあるのは、URL encodeを使うのは、リクエストヘッダにとって最終的にiso-8859-1符号化方式でバイナリに符号化される101010......(イントラコード変換のように、中間テーブルを利用してメモリのプログラムがiso-8859-1符号化に変換される)の純データはインターネット上で配信され、中国語などの特殊文字をそのままiso-8859-1符号化すると情報が失われるので、URL encodeを先に作る必要があります.
------------------------------------------------------------------------------------------------------まず依存優先順位は<%@page contentType="text/html;charset=UTF-8"%>が<%@より大きい PageEncoding="UTF-8"%>ページエンコーディング方式(右クリック->プロパティで表示)より大きい場合、<%@page contentType="text/html;charset=UTF-8"%>とともに<%@ pageEncoding="UTF-8"%>例えば:<%@page contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>ではcharsetとpageEncoding符号化は一致しなければなりません.そうしないと、中国語のあるページに対してエラーが報告されます.また、formであるgetリクエストについては、図1のようにformのgetリクエストではなく、独自に構築された中国語付きURLは、window.location.href=「/cnca/conversionEx/download.action?startOscym=」+startOscym+「&endOscym=」+endOscym+「&modelid=」+modelid+「&realname=」+realname=」+realname;図2のようにencodingはしません.
Ajaxにコミットされたpostまたはgetリクエストに対してもencodingは行われません.Tomcatの場合、Actionではrequest.getParameter()で決定された値は文字化されずwsに配備されて文字化されているので、jsではvar url="/cnca/conversionEx/download.action?startOscym="+startOscym+"&endOscym="+endOscym+"+endOscym+"+modelid="+modelid+"&realname="+realname="+realname;url = encodeURI(url);--------------------------------------------
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]
view plain
copy
print
?
new String(request.getParameter("name").getBytes("iso-8859-1"),"クライアントが指定したURL encode符号化方式")
バイトコードを復元して、正しい方法でデータを復号して、ネット上の文章は通常tomcatの中で配置します Xmlコード
[html]
view plain
copy
print
?
これはtomcatがデータを取得した後に指定の方式でURL decoder("%"に遭遇したらdecode動作をする)を使用させ、URL decoderの紹介はここにある
http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/net/URLDecoder.html#decode(java.lang.String,%20java.lang.String)-------------------------------------------------------------------------------------------------------------------------------------まず、encodingの符号化はGBKであり、decoding(復号)の符号化はISO-8859-1であるため、Java.net.URLDecoder.decode(encoding後に%xyとして表現されるバイトコード、「ISO-8859-1」)を復号する.だからrequest.getParameter()は文字化けしています.このようなnew java.lang.String(request.getParameter().getBytes("ISO-8859-1"),"GBK")を用いて、まずISO-8859-1 Encodingを用い、GBK decodingを文字列にしている.System.out.println(new java.lang.String((java.net.URLDecoder.decode(java.net.URLEncoder.encode(「組織名」,「GBK」)、「ISO-8859-1」)).getBytes(「ISO-8859-1」)、「GBK」)(二)post提出 1.クライアント(ブラウザ)のformフォームはpostメソッドでデータをエンコードしてサーバ側に送信する方法です. postメソッドで転送するデータもURL encodeが必要ですが、彼はどんな符号化方式を使っていますか? formが存在するhtmlファイルにがある場合、postはここで指定した符号化方式で符号化されます.一般的には、このコードはブラウザにどの文字セットでWebページを解釈するかを知らせるために使われていると考えられています.そのため、ウェブサイトはhtmlコードの最先端に置いて、できるだけ文字化けしないようにしていますが、formフォームのpostメソッドを指定してhttp request bodyのURL encode符号化方式にデータを提出する役割もあります.ここからgetメソッドでは,ブラウザのデータに対するURL encodeの符号化方式はブラウザ設定で決定され,(jsで統一指定可能),postメソッドでは開発者が指定できることが分かる.2.サーバ側(tomcat)は、復号化のためにデータを取得する方法です. tomcatのデフォルト設定でフィルタなどの符号化設定もしていない場合はiso-8859-1で復号されますが、request.setCharacterEncoding(「文字セット」)は役に立ちます.
http://www.cnblogs.com/yencain/articles/1321386.html ; http://wanghuan8086.javaeye.com/blog/173869
Tomcat 5.xからGETメソッドとPOSTメソッドが発行した情報は、tomcatが異なる方法で符号化を処理し、POST要求に対してTomcatはrequest.setCharacterEncodingメソッドで設定された符号化を使用して処理し、設定されていない場合はデフォルトのiso-8859-1符号化を使用する.一方、GETリクエストは異なり、TomcatはGETリクエストに対してrequest.setCharacterEncodingメソッドで設定された符号化を考慮せず、iso-8859-1符号化を永遠に使用し、この友人はちょうどGETリクエストを使用しているため、tomcatはiso-8859-1を使用してコミットされたバイトを文字列に変換する. 解決策は3つあります. 1. GETリクエストをPOSTリクエストに変更すると、request.setCharacterEncodingメソッドを使用してエンコードを設定し、request.getParameterメソッドを使用して中国語リクエストパラメータを直接取得できます. 2. GETリクエストを変更することなく、サーブレットでは以下のコードを使用して中国語リクエストパラメータを得る. String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK"); 3.getデータのUTF 8符号化を保証するため、server.xmlで以下のように設定したmaxSpareThreads="75"enableLookups="false"redirectPort="8443" acceptCount="100"debug="99"connectionTimeout="20000" disableUploadTimeout="true"URIEncoding="UTF-8"/>
------------------------------------------------------------------------------------------------------まず依存優先順位は<%@page contentType="text/html;charset=UTF-8"%>が<%@より大きい PageEncoding="UTF-8"%>ページエンコーディング方式(右クリック->プロパティで表示)より大きい場合、<%@page contentType="text/html;charset=UTF-8"%>とともに<%@ pageEncoding="UTF-8"%>例えば:<%@page contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>ではcharsetとpageEncoding符号化は一致しなければなりません.そうしないと、中国語のあるページに対してエラーが報告されます.また、formであるgetリクエストについては、図1のようにformのgetリクエストではなく、独自に構築された中国語付きURLは、window.location.href=「/cnca/conversionEx/download.action?startOscym=」+startOscym+「&endOscym=」+endOscym+「&modelid=」+modelid+「&realname=」+realname=」+realname;図2のようにencodingはしません.
Ajaxにコミットされたpostまたはgetリクエストに対してもencodingは行われません.Tomcatの場合、Actionではrequest.getParameter()で決定された値は文字化されずwsに配備されて文字化されているので、jsではvar url="/cnca/conversionEx/download.action?startOscym="+startOscym+"&endOscym="+endOscym+"+endOscym+"+modelid="+modelid+"&realname="+realname="+realname;url = encodeURI(url);--------------------------------------------
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]
view plain
copy
?
new String(request.getParameter("name").getBytes("iso-8859-1"),"クライアントが指定したURL encode符号化方式")
バイトコードを復元して、正しい方法でデータを復号して、ネット上の文章は通常tomcatの中で配置します Xmlコード
[html]
view plain
copy
?
これはtomcatがデータを取得した後に指定の方式でURL decoder("%"に遭遇したらdecode動作をする)を使用させ、URL decoderの紹介はここにある
http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/net/URLDecoder.html#decode(java.lang.String,%20java.lang.String)-------------------------------------------------------------------------------------------------------------------------------------まず、encodingの符号化はGBKであり、decoding(復号)の符号化はISO-8859-1であるため、Java.net.URLDecoder.decode(encoding後に%xyとして表現されるバイトコード、「ISO-8859-1」)を復号する.だからrequest.getParameter()は文字化けしています.このようなnew java.lang.String(request.getParameter().getBytes("ISO-8859-1"),"GBK")を用いて、まずISO-8859-1 Encodingを用い、GBK decodingを文字列にしている.System.out.println(new java.lang.String((java.net.URLDecoder.decode(java.net.URLEncoder.encode(「組織名」,「GBK」)、「ISO-8859-1」)).getBytes(「ISO-8859-1」)、「GBK」)(二)post提出 1.クライアント(ブラウザ)のformフォームはpostメソッドでデータをエンコードしてサーバ側に送信する方法です. postメソッドで転送するデータもURL encodeが必要ですが、彼はどんな符号化方式を使っていますか? formが存在するhtmlファイルにがある場合、postはここで指定した符号化方式で符号化されます.一般的には、このコードはブラウザにどの文字セットでWebページを解釈するかを知らせるために使われていると考えられています.そのため、ウェブサイトはhtmlコードの最先端に置いて、できるだけ文字化けしないようにしていますが、formフォームのpostメソッドを指定してhttp request bodyのURL encode符号化方式にデータを提出する役割もあります.ここからgetメソッドでは,ブラウザのデータに対するURL encodeの符号化方式はブラウザ設定で決定され,(jsで統一指定可能),postメソッドでは開発者が指定できることが分かる.2.サーバ側(tomcat)は、復号化のためにデータを取得する方法です. tomcatのデフォルト設定でフィルタなどの符号化設定もしていない場合はiso-8859-1で復号されますが、request.setCharacterEncoding(「文字セット」)は役に立ちます.
http://www.cnblogs.com/yencain/articles/1321386.html ; http://wanghuan8086.javaeye.com/blog/173869
Tomcat 5.xからGETメソッドとPOSTメソッドが発行した情報は、tomcatが異なる方法で符号化を処理し、POST要求に対してTomcatはrequest.setCharacterEncodingメソッドで設定された符号化を使用して処理し、設定されていない場合はデフォルトのiso-8859-1符号化を使用する.一方、GETリクエストは異なり、TomcatはGETリクエストに対してrequest.setCharacterEncodingメソッドで設定された符号化を考慮せず、iso-8859-1符号化を永遠に使用し、この友人はちょうどGETリクエストを使用しているため、tomcatはiso-8859-1を使用してコミットされたバイトを文字列に変換する. 解決策は3つあります. 1. GETリクエストをPOSTリクエストに変更すると、request.setCharacterEncodingメソッドを使用してエンコードを設定し、request.getParameterメソッドを使用して中国語リクエストパラメータを直接取得できます. 2. GETリクエストを変更することなく、サーブレットでは以下のコードを使用して中国語リクエストパラメータを得る. String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK"); 3.getデータのUTF 8符号化を保証するため、server.xmlで以下のように設定した