ネットワーク伝送における符号化と復号化

5363 ワード

この文章を書いた理由:フロントエンドがパラメータにプラス記号を渡すと、バックエンドまでスペースに変換され、この問題に疑問を抱き、資料検索を行い、符号化面が弱く、学習記録を行うことが分かった.
以上の問題解決方法:
URLEncoder.encode(" ","utf-8");
URLDecoder.decode(" ","utf-8");

パラメータを渡すときは符号化し、パラメータを取得して復号する
原因:今までまだ比较的に困惑して、知っていて1回知らせて下さい、ありがとうございます

文字セットと符号化方式


文字セット(バイナリと文字の1つ1つのマッピング)
  • ASCII(最初の文字セット)
  • GB 2312--->GBK->>GB 18030(各国文字セット)
  • Unicode(統合文字セット)*Unicodeがハードディスクを占有し、トラフィックが大きいという問題を解決するために、関連する符号化方式が発生しました.
  • utf-8
  • utf-16


  • urlコード:

  • コンセプトリファレンス:https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81URIで許可される文字は、予約文字と非予約文字(RFC 3986で規定されている予約文字と非予約文字)に分けられます.予約文字:!*'( ) ; : @ & = + $ ,/? # []非予約文字:AZ,az,09,-.予約文字が特定のコンテキストにおいて特別な意味を有する場合、URIにおいて他の目的のために使用する必要がある場合、その文字はパーセンテージ符号化されなければならない.! # $ & ' ( ) * + , / : ; = ? @ [ ] %21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D
  • 使用1.url中のPathInfoの実際のurlパス符号化方式はブラウザによって決定する.urlにおけるQueryStringの実際のurlパス符号化方式はブラウザによって決定される.getリクエストまたはpostリクエストContent-Typeの値は、アプリケーション/x-www-form-urlencodedフォームがコミットされると、パラメータ中の中国語の符号化はHTMLコードで指定された文字符号化に基づいて決定される(すなわちhtmlコードでラベルで指定された文字符号化).もちろんこれはformにaccept-charsetが指定する場合であり、formにaccept-charset="GBK”の属性が付加されている場合、フォームパラメータはaccept-charsetで指定する符号化によって符号化される
  • である.

    Jsp/Servletコード:

  • jsp/servletでは主に以下のいくつかの場所で符号化を設定できます.
  • pageEncoding="UTF-8"
  • jspをservletにコンパイルする際に用いる符号化
  • を設定する.
  • 例えば、jspファイルはgbk形式で保存され、pageEncoding="UTF-8"の場合servletは文字化けし
  • が発生する.
  • JSPでcontentTypeパラメータを指定せずresponseを使用しない.setCharacterEncodingメソッドの場合、サーバ応答を再符号化する符号化
  • を指定する.
  • responseは、トランスポートストリームに変換する符号化方式およびブラウザの復号方式を設定する必要があるサーバがブラウザに送信するデータのデフォルトはISO-8859-1に従って符号化され、ブラウザがデータを受信した後、デフォルトの文字セットに従って復号した後に表示され、ブラウザのデフォルト復号文字セットがISO-8859-1でなければ、文字化けが発生する.ISO-8859-1は中国語をサポートしていません.つまり、中国語を伝送するには他の伝送方式を採用しなければなりません.そうしないと、文字化けになります.
  • response.setCharacterEncoding("utf-8”);サーバ側のコードを設定し、デフォルトはISO-8859-1である.この方法はresponse.getWriter()の前に設定し、Content-Typeフィールドが設定されている場合はresponse.setCharacterEncodingメソッドで設定された文字セット符号化は、Httpメッセージの応答ヘッダに表示され、ブラウザにutf-8を使用して復号するように要求されるresponse.setHeader("Content-Type", "text/html; ");またはresponse.setHeader("Content-Type", "text/html;");は、ブラウザサーバが送信するデータフォーマットがtext/htmlであることを通知し、ブラウザにutf-8を使用して復号するように要求する.
  • response.setContentType("text/html;charset=utf-8”);またはresponse.setHeader("Content-Type", "text/html; charset=utf-8”);実はresponseを覆う.setCharacterEncoding(「utf-8」)は、開発においてresponse.setContentType("text/html;charset=utf-8")を設定するだけでよい.ブラウザサーバに通知するデータフォーマットはtext/htmlであり、サーバはutf-8符号化を採用し、ブラウザにutf-8を用いて復号するように要求する.
  • response.setCharacterEncoding("utf-8”);サーバ側の符号化をutf-8 response.getWriter().println("”);に設定し、ブラウザにutf-8を使用して復号し、htmlフォーマット全体に従ってheadに書くように要求する.2つ目の方法が最も簡便であり、開発で最もよく使われている方法でもあることがわかります.setCharacterEncoding優先度はsetContentTypeおよびsetLocale()ノードより
  • 高い.
  • requestはURLプログラミングに関し、urlを参照してサーバ側に符号化し、requestを通過する.setCharacterEncoding(「utf-8」)は、サーバのutf-8(デフォルトはISO-8859-1)への復号化を設定できますが、リクエストボディ内のパラメータにのみ有効です.パラメータがリクエストラインのuriの後にあると、何もできません.そのため、リクエスト方式が異なり、文字化けを解決する方法も異なります.
  • アドレスバーに直接URLを入力アクセス符号化方式はブラウザによって決定され、RFC 3986プロトコルは強制的にUTF-8に変換することを要求し、処理を容易にするために、ハイパーリンクとフォームのアクセスによってutf-8フォーマットでなければならないことを規定し、すなわち現在のページを表示する符号化もutf-8を使用しなければならない.これによりブラウザはutf-8を用いてパラメータを統一的に符号化する
  • .
  • ページのハイパーリンクアクセスをクリックすると、パラメータは現在のページの表示符号化に従って符号化され、RFC 3986プロトコルは強制的にUTF-8に変換される.
  • フォームアクセスを発行し、パラメータを現在のページの表示符号化に従って符号化する.ソリューション:
  • post要求post方式はフォームの提出に属し、パラメータは要求体に存在し、requestを通過する.setCharacterEncoding(「utf-8」)で文字化けしが解決します.
  • get方式get方式でコミットされたパラメータは、リクエストラインのuriの後に続き、サーバはデフォルトのiso-8859-1で復号されます.この場合、乱符号化を解決するには2つの方法があります.
  • サーバ側のuriパラメータのデフォルト符号化tomcatのserverを変更する.xmlでは、要素の属性URIEncoding="UTF-8"を設定すればよい.(デフォルトではこの属性は設定されていない)注意:1、要素の属性useBodyEncodingForURI="true"を設定する,要求体とuriは同じ符号化フォーマットを用いることを意味する.この2つの属性を設定することで,get方式の文字化けしを解決するとともにpost方式の文字化けしを解決することができる.2、serverを修正する.xml指定サーバはgetとpostをutf-8で統一的に復号し、tomcat管理下のすべてのwebアプリケーションにutf-8符号化、すなわちすべてのjsp、htmlページにutf-8符号化を使用するように要求する.例えばJSPページのヘッダ情報は、pageEncoding="utf-8"%>
  • パラメータはブラウザからサーバまで、クライアントutf-8符号化を経て、サーバ側iso-8859-1が復号され、最終的に乱符号化される.では、文字化けして逆の符号化を行い、正常なパラメータ値を得ることができます.例:String name=request.getParameter("name");//乱符号name=new String(name.getBytes("iso-8859-1")、"utf-8");//正常なname値を得る注意:name.getBytes();符号化を指定しない場合、デフォルトではgb 2312に従って符号化される.