String ログイン名 = ParamUtil.getString(request, "ログイン名");
ログイン名 = java.net.URLDecoder.decode(ログイン名,"UTF-8");
URL を使用してパラメータを渡す場合、中国語の名前または URL アドレスを持つ一部のパラメータが渡されることが多く、バックグラウンド処理中に変換エラーが発生します。一部の配信ページではGB2312が使用されており、受信ページではUTF8が使用されているため、受信したパラメータが元のパラメータと一致しない可能性があります。サーバー側の urlEncode 関数を使用してエンコードされた URL と、クライアント側の JavaScript の encodeURI 関数を使用してエンコードされた URL では、結果が異なります。
JavaScript のエンコード方法:
scape() メソッド:
ISO ラテン文字セットを使用して、指定された文字列をエンコードします。すべてのスペース、句読点、特殊文字、およびその他の非 ASCII 文字は、%xx 形式の文字エンコーディングに変換されます (xx は、文字セット テーブル内の文字エンコーディングの 16 進数と同じです)。たとえば、スペース文字に対応するエンコーディングは です。アンエスケープ方式はその逆です。このメソッドでエンコードされない文字: @ * /
gb2312 エンコードの場合は、escape を使用できますが、encodeURIComponent は使用できません。そうしないと文字化けします。
エスケープの使用方法:
http://www.jb51.net/w3school/jsref/jsref_escape.htm
英語の説明: MSDN JScript リファレンス: エスケープ メソッドは、[引数] の内容を含む文字列値 (Unicode 形式) を返します。すべてのスペース、句読点、アクセント記号付き文字、およびその他の非 ASCII 文字は、%xx エンコードに置き換えられます。ここで、xx は文字を表す 16 進数に相当します。たとえば、スペースは「
」として返されます。
Edge Core Javascript ガイド:escape 関数と unescape 関数を使用すると、文字列をエンコードおよびデコードできます。escape 関数は、ISO ラテン文字セットの引数の 16 進エンコーディングを返します。unescape 関数は、指定された 16 進エンコーディング値
encodeURI() メソッド: UTF-8 エンコード形式を使用して、URI 文字列をエスケープ形式の文字列に変換します。このメソッドでエンコードされない文字: ! @ # $& * ( ) = : / ;
英語の説明: MSDN JScript リファレンス: encodeURI メソッドはエンコードされた URI を返します。結果を decodeURI に渡すと、encodeURI メソッドは次の文字をエンコードしません。これらの文字をエンコードするには、encodeURIComponent を使用します。 Edge Core Javascript ガイド: 特定の文字の各インスタンスを、UTF-8 エンコードを表す 1 つ、2 つ、または 3 つのエスケープ シーケンスで置き換えることで、Uniform Resource Identifier (URI) をエンコードします。キャラクター
encodeURIComponent() メソッド: UTF-8 エンコード形式を使用して、URI 文字列をエスケープ形式の文字列に変換します。 encodeURI() と比較して、このメソッドは / やその他の文字など、より多くの文字をエンコードします。したがって、文字列に URI の複数の部分が含まれている場合、このメソッドを使用してエンコードすることはできません。そうしないと、/ 文字がエンコードされた後で URL にエラーが表示されます。このメソッドでエンコードされない文字: ! * ( )
英語の説明: MSDN JScript リファレンス: encodeURIComponent メソッドはエンコードされた URI を返します。結果を decodeURIComponent に渡すと、元の文字列が返されます。encodeURIComponent メソッドはすべての文字をエンコードするため、文字列が /folder1/ などのパスを表す場合には注意してください。文字列に複数の URI コンポーネントが含まれる場合、スラッシュ文字はエンコードされ、無効になります。特定の文字の各インスタンスを、文字の UTF-8 エンコードを表す 1 つ、2 つ、または 3 つのエスケープ シーケンスに置き換えることによって、Uniform Resource Identifier (URI) コンポーネントを作成します。
したがって、中国語の文字列の場合、文字列エンコード形式を UTF-8 形式に変換したくない場合 (たとえば、元のページとターゲット ページの文字セットが同じ場合)、エスケープを使用するだけで済みます。ページが GB2312 またはその他のエンコードで、パラメーターを受け入れるページが UTF-8 エンコードされている場合は、encodeURI または encodeURIComponent を使用する必要があります。
また、encodeURI/encodeURIComponentはjavascript1.5以降に導入され、javascript1.0ではエスケープが利用可能になりました。
英文注释:The escape() method does not encode the character which is interpreted as a space on the server side as well as generated by forms with spaces in their fields. Due to this shortcoming, you should avoid use of escape() whenever possible. The best alternative is usually encodeURIComponent().Use of the encodeURI() method is a bit more specialized than escape() in that it encodes for URIs [REF] as opposed to the querystring, which is part of a URL. Use this method when you need to encode a string to be used for any resource that uses URIs and needs certain characters to remain un-encoded. Note that this method does not encode the ' character, as it is a valid character within URIs.Lastly, the encodeURIComponent() method should be used in most cases when encoding a single component of a URI. This method will encode certain chars that would normally be recognized as special chars for URIs so that many components may be included. Note that this method does not encode the ' character, as it is a valid character within URIs.