encodeURIはURL伝達時になぜencodeURI符号化を2回行う必要があるのかを解決する
4263 ワード
説明:1.EncodeURL関数は主にURIをトランスコードするために使用され、デフォルトではUTF-8の符号化が採用される. 2. UTF-8符号化のフォーマット:1つの漢字から3バイトで構成する、1バイトごとに16進数の符号化に変換し、同時に%番号を追加する.
まず、フロントエンドコードを見てみましょう.
エンコーディング
EnCodeURL(enCodeURI(url))では、まず解答をしないで、バックグラウンドコードを見てみましょう
バックグラウンドでjavaを使用しました.net.URLDecoder.decode(organame、「UTF-8」)関数はurlから渡された機構名を復号し、機構名の中国語文字列を取得します.なぜバックグラウンドでurlを2回符号化するのか、バックグラウンドで機構名にアクセスしたときに文字化けしないのか、私が調べた資料を見てみましょう.
ここでは2回encodeURIをする理由と説明をしますが、個人的な感覚ははっきりしていて、理解してほしいと思います.
具体的には、ページ端から入力された機構名(organame)が中国語で「中」であると仮定し、次の手順で復号する1.初めてencodeURIをutf-8方式で取得してバイト配列を[-28,-72-83]とし、バイトコード配列を遍歴し、各バイトを対応する16進数に変換することで[E 4,B 8,AD]となり、最後に[%E 4,%B 8,%AD]となる
2.2回目のencodeURIは、配列を最後に[%25 E 4,%25 B 8,%25 AD]にして処理後のデータ[%25 E 4,%25 B 8,%25 AD]をサーバ側に送信し、
アプリケーションサーバがgetParameterメソッドを呼び出すと、getParameterメソッドはアプリケーションサーバにパラメータを要求し、アプリケーションサーバが最初に取得したのは送信された[%25 E 4,%25 B 8,%25 AD]である.
アプリケーションサーバはこのデータに対してURLdecode操作を行い、URldecode操作とencodeURL操作は逆の操作であり、処理結果は[%E 4,%B 8,%AD]であり、この値をgetParameterメソッドに戻し、サーバ側で対応するURLトランスコードメソッドまたは関数を呼び出すことでデータを最初のページから送られてきた中国語「中」に復元することができる.
URLコードと2回encodeURI
アドレスバーを使用してクエリー・パラメータをコミットする場合、符号化しない場合、非英語文字はオペレーティング・システムの文字セットに従って符号化されてサーバにコミットされ、サーバは構成された文字セットに従って復号されるため、両者が一致しないと文字化が乱れます.
EncodeURI関数はUTF-8を用いてURLを符号化するため、サーバが復号化時に他の符号化方式を用いると文字化けし、デフォルトのサーバ構成の復号文字セットはUTF-8ではないため、ほとんどの場合、アドレスバーが中国語クエリーパラメータを提出する際に文字化けしが発生する.この場合、encodeURIを2回連続する使用して、クライアント(主にブラウザ)で非英語文字を符号化し、サービス側でjavaを使用することができる.net.URLDecoder(String."UTF-8")を復号すると、正しい中国語が得られます.
encodeURIを一度だけ行うと、UTF-8形式のURLが得られ、サーバ側はrequestを通過する.getParameter()はクエリパラメータ(通常iso-8859-1)を復号すると文字化けします.
2回encodeURIを行った場合、1回目の符号化で得られたのはUTF-8形式のURLであり、2回目の符号化で得られたのは依然としてUTF-8形式のURLであるが、効果的にはまず1回のUTF-8符号化(このときはすべてASCII文字に変換された)を行い、iso-8859-1符号化を1回行ったことに相当する.英字ではUTF-8符号化とISO-8859-1符号化の効果は同じであるからである.サーバ側では、まずrequestを通過する.getParameter()は、1回目の復号(gb 2312、gbk、utf-8、iso-8859-1などの文字セットである、結果に影響を及ぼさない)を自動的に行いascii文字を得る、その後UTF-8を用いて2回目の復号を行い、通常javaを用いる.net.URLDecoder(「UTF-8」)メソッド.
2回の符号化2回の復号化のプロセスは、次のとおりです.
UTF-8符号化->UTF-8(iso-8859-1)符号化->iso-8859-1復号->UTF-8復号、符号化と復号化のプロセスは対称なので、文字化けは発生しません.
EncodeURL関数は主にURIに対してトランスコードを行い、デフォルトはUTF-8の符号化を採用する.UTF-8符号化のフォーマット:1つの漢字から3バイトで構成する、1バイトごとに16進数の符号化に変換し、同時に%番号を追加する.
まとめ:
1、フロントエンドで2回符号化(utf-8の符号化形式を使用)
2、バックグラウンドサーバは自動的に一度復号するが、utf-8のフォーマットで復号するかどうか
3、2回の符号化2回の復号化プロセスは、UTF-8符号化->UTF-8(iso-8859-1)符号化->iso-8859-1復号->UTF-8復号化であり、符号化と復号化のプロセスは対称であるため、乱符号化は発生しない.
)
まず、フロントエンドコードを見てみましょう.
/**
* datagrid
*/
function initDatagrid(id,typevalue,organame){
var url="${base}/organization/queryOrganizationList.action?id="+id+"&typevalue="+typevalue+"&organame="+organame+"" ;
url=encodeURI(encodeURI(url));
$("#dataGridObject").datagrid({
title:'', //
method:'post',
border:false,
singleSelect:false, //
fitColumns: true, // , , 。
striped: true, //
collapsible:true,//
url:url, //
queryParams:params, //
pageSize:20,})
このコードを見た学生は、なぜurlが2回行われたのか疑問に思うかもしれません.エンコーディング
EnCodeURL(enCodeURI(url))では、まず解答をしないで、バックグラウンドコードを見てみましょう
@SuppressWarnings("rawtypes")
@RequestMapping(value = "organization/queryOrganizationList")
@ResponseBody
public Map queryOrganizationList(HttpServletRequest request, PageRequest pageRequest,QueryOrganizationParamsVO paramsVO,
int page, int rows,String id,String typevalue,String organame) throws UnsupportedEncodingException {
Map map = new HashMap();
pageRequest.setPageSize(rows);
pageRequest.setPageNo(page);
AuthInfo logininfo=SessionUtil.getLoginUsers(request).get(0);
String orgid=logininfo.getOrganId();
// : java.net.URLDecoder.decode() ,
organame=java.net.URLDecoder.decode(organame , "UTF-8");
try {
Page pages = this.organizationService.queryOrganizationList(pageRequest, paramsVO,id,typevalue,orgid,organame);
map.put("total", pages.getTotalCount());
map.put("rows", pages.getRows());
} catch (Exception e) {
System.out.println(e.getMessage());
map.put("total", 0);
map.put("rows", 0);
}
return map;
}
バックグラウンドでjavaを使用しました.net.URLDecoder.decode(organame、「UTF-8」)関数はurlから渡された機構名を復号し、機構名の中国語文字列を取得します.なぜバックグラウンドでurlを2回符号化するのか、バックグラウンドで機構名にアクセスしたときに文字化けしないのか、私が調べた資料を見てみましょう.
ここでは2回encodeURIをする理由と説明をしますが、個人的な感覚ははっきりしていて、理解してほしいと思います.
encodeURI ::
具体的には、ページ端から入力された機構名(organame)が中国語で「中」であると仮定し、次の手順で復号する1.初めてencodeURIをutf-8方式で取得してバイト配列を[-28,-72-83]とし、バイトコード配列を遍歴し、各バイトを対応する16進数に変換することで[E 4,B 8,AD]となり、最後に[%E 4,%B 8,%AD]となる
2.2回目のencodeURIは、配列を最後に[%25 E 4,%25 B 8,%25 AD]にして処理後のデータ[%25 E 4,%25 B 8,%25 AD]をサーバ側に送信し、
アプリケーションサーバがgetParameterメソッドを呼び出すと、getParameterメソッドはアプリケーションサーバにパラメータを要求し、アプリケーションサーバが最初に取得したのは送信された[%25 E 4,%25 B 8,%25 AD]である.
アプリケーションサーバはこのデータに対してURLdecode操作を行い、URldecode操作とencodeURL操作は逆の操作であり、処理結果は[%E 4,%B 8,%AD]であり、この値をgetParameterメソッドに戻し、サーバ側で対応するURLトランスコードメソッドまたは関数を呼び出すことでデータを最初のページから送られてきた中国語「中」に復元することができる.
URLコードと2回encodeURI
アドレスバーを使用してクエリー・パラメータをコミットする場合、符号化しない場合、非英語文字はオペレーティング・システムの文字セットに従って符号化されてサーバにコミットされ、サーバは構成された文字セットに従って復号されるため、両者が一致しないと文字化が乱れます.
EncodeURI関数はUTF-8を用いてURLを符号化するため、サーバが復号化時に他の符号化方式を用いると文字化けし、デフォルトのサーバ構成の復号文字セットはUTF-8ではないため、ほとんどの場合、アドレスバーが中国語クエリーパラメータを提出する際に文字化けしが発生する.この場合、encodeURIを2回連続する使用して、クライアント(主にブラウザ)で非英語文字を符号化し、サービス側でjavaを使用することができる.net.URLDecoder(String."UTF-8")を復号すると、正しい中国語が得られます.
encodeURIを一度だけ行うと、UTF-8形式のURLが得られ、サーバ側はrequestを通過する.getParameter()はクエリパラメータ(通常iso-8859-1)を復号すると文字化けします.
2回encodeURIを行った場合、1回目の符号化で得られたのはUTF-8形式のURLであり、2回目の符号化で得られたのは依然としてUTF-8形式のURLであるが、効果的にはまず1回のUTF-8符号化(このときはすべてASCII文字に変換された)を行い、iso-8859-1符号化を1回行ったことに相当する.英字ではUTF-8符号化とISO-8859-1符号化の効果は同じであるからである.サーバ側では、まずrequestを通過する.getParameter()は、1回目の復号(gb 2312、gbk、utf-8、iso-8859-1などの文字セットである、結果に影響を及ぼさない)を自動的に行いascii文字を得る、その後UTF-8を用いて2回目の復号を行い、通常javaを用いる.net.URLDecoder(「UTF-8」)メソッド.
2回の符号化2回の復号化のプロセスは、次のとおりです.
UTF-8符号化->UTF-8(iso-8859-1)符号化->iso-8859-1復号->UTF-8復号、符号化と復号化のプロセスは対称なので、文字化けは発生しません.
EncodeURL関数は主にURIに対してトランスコードを行い、デフォルトはUTF-8の符号化を採用する.UTF-8符号化のフォーマット:1つの漢字から3バイトで構成する、1バイトごとに16進数の符号化に変換し、同時に%番号を追加する.
まとめ:
1、フロントエンドで2回符号化(utf-8の符号化形式を使用)
2、バックグラウンドサーバは自動的に一度復号するが、utf-8のフォーマットで復号するかどうか
3、2回の符号化2回の復号化プロセスは、UTF-8符号化->UTF-8(iso-8859-1)符号化->iso-8859-1復号->UTF-8復号化であり、符号化と復号化のプロセスは対称であるため、乱符号化は発生しない.
)