主に、URLとフォームの2つの形式の提出を介してサーバーにリクエストを送信します。フォームフォームには一般に、文字化けの問題はありません。文字化けの問題は主にURLにあります。以前のブログの導入を通じて、URLによってサーバーにエンコードする要求を送信するプロセスが本当に混乱していることがわかります。異なるオペレーティングシステム、異なるブラウザ、およびさまざまなWeb文字セットが、まったく異なるエンコード結果につながります。プログラマーがすべての結果を考慮に入れたい場合、それほど怖くないのでしょうか?クライアントが1つのエンコード方法のみを使用してサーバーにリクエストを発行することを保証する方法はありますか?
持っている!ここでは、主に次の方法を提供します
1。JavaScript
JavaScriptエンコードを使用しても、ブラウザに介入する機会が与えられません。エンコード後、サーバーにリクエストを送信し、サーバーでデコードします。この方法を習得するときは、JavaScriptエンコードの3つの方法が必要です:Escape()、encodeuri()、およびencodeuricomponent()。
逃げる
指定された文字列は、SIOラテン文字セットを使用してエンコードされます。すべての非ASCII文字は、%xx形式の文字列としてエンコードされます。ここで、xxは文字セットの文字に対応する16進数を表します。たとえば、形式に対応するエンコーディングは%20です。対応するデコード方法はunescape()です。
実際、Escase()はURLエンコードに直接使用することはできません。その実際の機能は、キャラクターのUnicodeエンコード値を返すことです。たとえば、上記の「I Am CM」の結果は%U6211%U662FCMです。「I」の対応するエンコードは6211、「はい」のエンコードは662F、「CM」のエンコードはCMです。
Escape()は「+」エンコーディングには正しくないことに注意してください。しかし、フォームを送信するときにWebページにスペースがある場合、 +文字に変換されることを知っています。サーバーがデータを処理すると、 +サインはスペースに処理されます。したがって、使用するときは注意してください。
ecodeuri
URL全体をエンコードすると、UTF-8形式を使用してエンコードされた文字列を出力します。ただし、Encodeuriは、次のようなASCIIエンコードを除いて、いくつかの特殊文字をエンコードしません。 @#$& *()=: /; ? + '。
encodeuricopenent()
URI文字列をUTF-8エンコード形式のエスケープフォーマット文字列に変換します。 encodeuriと比較して、ecodeuricomponentはより強力であり、encodeuri()でエンコードされていないシンボル(; /?: @&= + $、#)にエンコードされます。ただし、Encodeuricomponentは、URLのコンポーネントを個別にのみエンコードし、URL全体をエンコードするために使用されません。対応するデコード関数メソッドDecodeuricomponent。
もちろん、私たちは通常、Encodeuriパーティーを使用してエンコード操作を実行します。バックグラウンドで2回エンコードしてデコードするいわゆるJavaScriptは、この方法を使用することです。 JavaScriptには、この問題を解決するための2つのソリューションがあります。1つのトランスコーディングと2つのトランスコーディング方法です。
トランスコーディングが一度
JavaScriptトランスコード:
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri(url);
トランスコードされたURL:http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%E6%8A%91%E6%98%AFCM
バックエンド処理:
文字列名= request.getParameter( "name"); System.out.println( "前景着信パラメーター:" + name); name = new String(name.getBytes( "ISO-8859-1")、 "utf-8"); System.out.println( "デコードされたパラメーター:" + name);
出力結果:
フロントデスクの着信パラメーター:?????? CM
パラメーターを解読した後:私はCMです
二次トランスコーディング
JavaScript
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri(encodeuri(url));
トランスコードURL:http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%25e6%2588%2591%25E6%2598%25AFCM
バックエンド処理:
文字列名= request.getParameter( "name"); System.out.println( "前景着信パラメーター:" + name); name = urldecoder.decode(name、 "utf-8"); System.out.println( "デコードされたパラメーター:" + name);
出力結果:
フロントエンドの着信パラメーター:E68891E698AFCM
パラメーターを解読した後:私はCMです
フィルター
フィルターを使用して、フィルターLZは2つのタイプを提供します。1つ目はエンコードを設定することです。2つ目は、フィルターでデコード操作を直接実行することです。
フィルター1
このフィルターは、リクエストのエンコード形式を直接設定します。
パブリッククラスのキャラクターエンコードはフィルター{private filterconfig config;文字列エンコード= null; public void Destroy(){config = null; } public void dofilter(servletRequest request、servletResponse応答、フィルターチェーンチェーン)IoException、servletexception {request.setcharacterencoding(encoding); Chain.dofilter(リクエスト、応答); } public void init(filterconfig config)servletexception {this.config = config; //構成パラメーターを取得するstring str = config.getInitParameter( "encoding"); if(str!= null){encoding = str; }}}構成:
<filter> <filter-name>中国人filter-name> <filter-class> com.test.filter.characterencodingfilter-class> <init-name> ecodingparam-name> <param-value> utf-8param-value> init-value> init-param> <フィルターマッピング<url-pattern>/*url-pattern>フィルターマッピング>
フィルター2
処理方法では、フィルターはパラメーターを直接デコードし、デコードされたパラメーターを要求属性にリセットします。
パブリッククラスのキャラクターエンコードは、フィルター{Protected filterConfig filterconfig;文字列エンコード= null; public void Destroy(){this.filterconfig = null; } / ***初期化* / public void init(filterconfig filterconfig){this.filterconfig = filterconfig; } / *** utf -8のエンコーディングフォームにインストルを変換** @param string* @return utf -8のエンコードフォームstring* @throws unsupportedencodingexception* / private string toutf(string instr)throws unsupportedencodingexception {string outstr = ""; if(grouth!= null){outstr = new String(instr.getBytes( "iso-8859-1")、 "utf-8"); } return outstr; } / ***中国の文字盤フィルタリング処理* / public void dofilter(servletrequest servletrequest、servletResponse servletResponse、フィルターチェーンチェーン)IoException、servletexception {httpservletrequest request =(httpservletrequest)servletrequest; httpservletResponse応答=(httpservletResponse)servletResponse; //リクエスト(1.postまたは2.get)を取得する方法、および異なるリクエストメソッドString method = request.getMethod()に従って異なる処理が実行されます。 //1。postで送信されたリクエストについては、エンコードをutf-8に直接設定します(method.equalsignorecase( "post")){try {request.setcharacterencoding( "utf-8"); } catch(unsupportedencodingexception e){e.printstacktrace(); }} // 2。get elseで送信されたリクエスト{//クライアントの列挙で送信されたパラメーターセットを取得paramnames = request.getParameternames(); //各パラメーターの名前と値を取得するようにパラメーターをトラバースしますwhile(paramnames.hasmoreelements()){string name = paramnames.nextelement(); //パラメーター名String値[] = request.getParametervalues(name); //パラメーター名に応じて値を削除します。 (int i = 0; i <values.length; i ++){try {// circle {// call back and call call call call call call bulation value value string vlust = toutf(values [i]);値[i] = vlustr; } catch(unsupportedencodingexception e){e.printstacktrace(); }} // request request.setattribute(name、values)の属性の形式で値を非表示にします。 }}} //応答方法を設定し、サポート漢字セットResponse.setContentType( "text/html; charset = utf-8"); //次のフィルターの実行を続けます。フィルターがない場合、Request Chain.dofilter(リクエスト、応答); }}構成:
<filter> <filter-name>中国人fillter-name> <filter-class> com.test.filter.characterencodingfilter-class> filter> <filter-mapping> <filter-name> shinethencodingfilter-name> <url-pattern>/*url-pattern>フィルターマッピング>
他の
1. PageEncodingとContentTypeを設定します
<%@ページ言語= "java" contentType = "text/html;
charset = utf-8 "pageencoding =" utf-8 "%>
2. TomcatのUriencodingをセットアップします
デフォルトでは、TomcatサーバーはISO-8859-1エンコード形式を使用して、Uriencodingパラメーターによって要求されたURLをエンコードするため、uriencoding =” utf-8 "をtomcatのserver.xmlファイルのタグに追加する必要があります。
上記はこの記事に関するすべてです。誰もがJavaの中国の文字化けの質問を学ぶことが役立つことを願っています。