web-dev-qa-db-ja.com

Java内の特殊文字のURLエンコードおよびデコード

Javaでは、HTTP Postを使用してリクエストをサーバーに送信する必要がありますが、URLのパラメーターに特殊文字が含まれていると、例外の下にスローされます

Java.lang.IllegalArgumentException:URLDecoder:エスケープ(%)パターンで不正な16進文字-入力文字列の場合: "& '"

データを送信するコード

DefaultHttpClient httpclient = new DefaultHttpClient(); 
   HttpPost httpPost = new HttpPost(URL); 

   String sessionId = RequestUtil.getRequest().getSession().getId();
   String data = arg.getData().toString();

   List<NameValuePair> params = new ArrayList<NameValuePair>();   
   params.add(new BasicNameValuePair(param1, data));
   params.add(new BasicNameValuePair(param2, sessionId));
         httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));           

   HttpResponse response = (HttpResponse) httpclient.execute(httpPost);

サーバー側では、以下のコードを使用して情報を読み取ります

 String data = request.getParameter(param1);
   if (data != null) {
    actionArg = new ChannelArg(URLDecoder.decode(data, "UTF-8"));
   }

コードは正しく機能しますが、[aああ#$%& '(<>?/。、あああああ])のような特殊文字を入力すると、例外がスローされます。特殊文字をデコードしますか?

事前にどうもありがとうございました。

17
Phu Nguyen

残念ながらURLエンコーダーは問題を解決しません。この問題が発生し、カスタムユーティリティを使用しました。私はググリングから得たこれを覚えています;).

http://www.javapractices.com/topic/TopicAction.do?Id=96

6

インターネットを安全に通過できるようにテキストをエンコードするには:

import Java.net.*;
...
try {
    encodedValue= URLEncoder.encode(rawValue, "UTF-8");
} catch (UnsupportedEncodingException uee) { }

そしてデコードする:

try {
    decodedValue = URLDecoder.decode(rawValue, "UTF-8");
} catch (UnsupportedEncodingException uee) { }
10
Steven
String data = request.getParameter(param1);

これが サーブレットAPI の場合、パラメータはすでにデコードされています。パーセントエンコーディングをこれ以上処理する必要はありません。


私はHttpClientを使用していませんが、ヘッダーでエンコードを送信していることを確認してください:

Content-type: application/x-www-form-urlencoded; charset=UTF-8

または、必要に応じて、getParameterを呼び出す前に既知のエンコーディングを設定します:

request.setCharacterEncoding("UTF-8");
4
McDowell

グアバを試す

com.google.common.net.UrlEscapersを使用します

中国語でうまくいきます

このような:

Escaper escaper = UrlEscapers.urlFragmentEscaper();
String result = escaper.escape(yoururl);
2
chrisssss