问题
In Java, I need to use HTTP Post to send request to server, but if in the parameter of the URL contains some special character it throws below Exception
java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "&'"
The code to send data
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);
And at the server side, i use the below code to read information
String data = request.getParameter(param1);
if (data != null) {
actionArg = new ChannelArg(URLDecoder.decode(data, "UTF-8"));
}
The code works correctly but if i input some special character like [aああ#$%&'(<>?/.,あああああ], it will throw exception. I wonder if someone could help me some hint to be able to encode and decode special characters?
Thank you very much in advance.
回答1:
Sadly url encoder will not solve your problem. I had this problem and used a custom utility. I remember this I got from googling ;).
http://www.javapractices.com/topic/TopicAction.do?Id=96
回答2:
To encode text for safe passage through the internets:
import java.net.*;
...
try {
encodedValue= URLEncoder.encode(rawValue, "UTF-8");
} catch (UnsupportedEncodingException uee) { }
And to decode:
try {
decodedValue = URLDecoder.decode(rawValue, "UTF-8");
} catch (UnsupportedEncodingException uee) { }
回答3:
String data = request.getParameter(param1);
If this is the servlet API, the parameters have already been decoded. No further handling of percent-encoding is necessary.
I haven't used HttpClient, but ensure it is sending the encoding in the header:
Content-type: application/x-www-form-urlencoded; charset=UTF-8
Or, if you must, set the known encoding before any getParameter
calls:
request.setCharacterEncoding("UTF-8");
回答4:
try guava
use com.google.common.net.UrlEscapers
it works fine with chinese
like this:
Escaper escaper = UrlEscapers.urlFragmentEscaper();
String result = escaper.escape(yoururl);
来源:https://stackoverflow.com/questions/4841331/url-encode-and-decode-special-character-in-java