これからはURIコードJavaScriptとC〓URIコードを恐れなくなります.

3875 ワード

混乱のURIコード
JavaScriptには三つの方法があります.escape、encodeURI、encodeURIComponent.
C葃中符号化の主な方法:HttpUtility.UrlEnccode、Server.UrlEnccode、Uri.Escape Uristring、Uri.Escape Data String
JavaScriptの中の幸いなことに、三つだけを提供しました.Cは主に使われています.他のコード(HTML)はまだリストされていません.多くは分かりません.心に恐れが生じ、恐怖がひどくなります.本論文ではJavaScriptとC觀の中でURIをエンコードする方法を詳しく説明します.
escape:おすすめできません.
理由:eacapeはBOM中の方法で、ASCII記号を正しく符号化することができますが、encodeURI、encodeURIComponentはすべてのUnicoode記号を符号化することができます.ECMAScript v 3はこの方法の使用に反対して、decodeURI()とdecodeURIComponent()を使用してそれを代替します.
escape符号化されていない文字は69文字あります.*,+,-,,,/,@,_,0-9,a-z,A-Z
encodeURI:アドレスをエンコードするためのもの(パラメータは含まない)
エンコーディングしない文字は82文字あります.(,),*,+,,,,-,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0-9,a-z,A-Z
エンカウントはこれのために設計されました.エンコーディングは、コロン(:)、スラッシュ(/)などのURIの特殊文字を符号化しません.以下の例を参照してください.
 
  
encodeURI("//www.jb51.net/a file with spaces.html")
// outputs //www.jb51.net/a%20file%20with%20spaces.html
スペースだけを20%に置き換えることができますので、この方法はURLをエンコードするのに使えます.
エンカウントはコロン(:)、スラッシュ(/)で符号化されていませんので、パラメータ(URLをパラメータとする)にコロン(:)、スラッシュ(/)が含まれていると解析エラーが発生しますので、パラメータをエンコードすることはできません.
encodeURIComponent:アドレスパラメータをエンコードするために使用します.
エンコーディングしない文字は71文字あります.(,),*,-,,,,,,,~,0-9,a-z,A-Z
この方法はコード化されていますので、それを使ってURLをエンコードすることはできません.この方法は中国語、スペース、井号、斜線(/)、コロン(:)をエンコードしているので、URIのパラメータをエンコードするのに適しています.以下の例を参照してください.
 
  
var param=" ";
var url="//www.jb51.net/?key="+encodeURIComponent(param)+"&page=1";
console.log(url);//outputs //www.jb51.net/?key=%E5%8D%9A%E5%AE%A2%E5%9B%AD&page=1
これはまさに私達が欲しい結果です.(ここでは符号化が必要なパラメータ(page=1は符号化不要)を符号化しました.
Server.UrlEncode&HttpUtility.UrlEncode:おすすめしません.
この二つを一緒に置いて言うと、この二つの方法はほとんど同じです.これらの違いはHttpUtility.UrlEnccodeがデフォルトでUTF 8フォーマットで符号化していますが、Server.UrlEnccodeはシステムのプリセットフォーマットを使って符号化しています.Server.UrlEncodeはパラメータとしてHttpUtility.UrlEncode符号化していますので、システム全体でUTF 8フォーマットで符号化するなら、この2つの方法は同じです.
この2つの方法はどのように符号化されていますか?例を見てみます.
 
  
string url1 = "//www.jb51.net/a file with spaces.html?a=1&b= #abc";
Response.Write(HttpUtility.UrlEncode(url1) );

//output
http%3a%2f%2fwww.jb51.net%2fa+file+with+spaces.html%3fa%3d1%26b%3d%e5%8d%9a%e5%ae%a2%e5%9b%ad%23abc
上記の例から分かるように、HttpUtility.UrlEnccodeはコロン(:)とスラッシュ(/)をエンコードしていますので、ウェブサイトをエンコードするのには使えません.
パラメータをエンコードできますか?答えも否定です.パラメータ中のスペースはHttpUtility.UrlEncodeにより符号化されるのではなく%20に符号化されるべきであるので、この2つの方法でURIを符号化することは推奨されない.
Uri.Escape Uristring:アドレスコード(パラメータを含まない)に対して、私達はやはり例を使って話します.
 
  
string url1 = "//www.jb51.net/a file with spaces.html?a=1&b= #abc";
Response.Write( Uri.EscapeUriString(url1));
//outputs:
//www.jb51.net/a%20file%20with%20spaces.html?a=1&b=%E5%8D%9A%E5%AE%A2%E5%9B%AD#abc
Uri.Escape Uristringはスペースを符号化し、中国語も符号化しているが、コロン(:)とスラッシュ(/)と井号は符号化されていないので、この方法はURLで符号化することができますが、パラメータを符号化することはできません.JavaScriptのencodeURI方法と似ています.
Uri.Escape DataString:アドレスパラメータをエンコードするためのものです.
例で話します.
 
  
string url1 = "//www.jb51.net/a file with spaces.html?a=1&b= #abc";
Response.Write(Uri.EscapeDataString(url1));
//outputs:
http%3A%2F%2Fwww.jb51.net%2Fa%20file%20with%20spaces.html%3Fa%3D1%26b%3D%E5%8D%9A%E5%AE%A2%E5%9B%AD%23abc
この方法は、Uri.Escape Data Stringがコロン(:)、スラッシュ(/)、スペース、中国語、井号(啯啷)を符号化しているため、URLには使用できないが、JavaScriptのencodeURIComponentのようなパラメータを符号化するために使用されても良い.
結び目
JavaScriptで推奨されているのは、エンコーディングでURIのURL部分をエンコードし、エンコーディングでURIで伝達されるパラメータをエンコードします.
C((zhi)でオススメするのは、URIのURL部分をUri.Escape Uristringで符号化し、URIで伝達されるパラメータをUri.Escape DataStringで符号化することです.
復号部分はもちろん、符号化方法に対応しています.
作者:天行健、自彊してやまない
出典:http://artwl.cnblogs.com