2011-01-30 40 views
16

Trong Java, tôi cần phải sử dụng HTTP bài viết để gửi yêu cầu đến máy chủ, nhưng nếu trong tham số của URL có chứa một số ký tự đặc biệt nó ném dưới ExceptionURL và nhân vật đặc biệt giải mã trong Java

java. lang.IllegalArgumentException: URLDecoder: nhân vật bất hợp pháp hex trong thoát (%) mẫu - Đối với chuỗi đầu vào: "& '

mã này để gửi dữ liệu

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); 

Và ở phía máy chủ, tôi sử dụng mã bên dưới để đọc thông tin

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

Mã này hoạt động một cách chính xác nhưng nếu tôi nhập một số ký tự đặc biệt như [a あ あ # $% & '(<>? /., あ あ あ あ あ], nó sẽ ném ngoại lệ. Tôi tự hỏi nếu có ai đó có thể giúp tôi một số gợi ý để có thể mã hóa và giải mã các ký tự đặc biệt?

Cảm ơn bạn rất nhiều trước.

Trả lời

5

encoder Đáng buồn thay url sẽ không giải quyết được vấn đề của bạn. Tôi đã có vấn đề này và sử dụng một tiện ích tùy chỉnh. Tôi nhớ điều này tôi nhận được từ googling;).

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

+3

Tôi giám sát một giải pháp tốt hơn. Bạn bè của chúng tôi từ apache có StringEscapeUtils (org.apache.commons.lang.StringEscapeUtils). Vui lòng kiểm tra xem nó có hoạt động không. –

7

Để mã hóa văn bản cho đi lại an toàn qua các internets:

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

Và để giải mã:

try { 
    decodedValue = URLDecoder.decode(rawValue, "UTF-8"); 
} catch (UnsupportedEncodingException uee) { } 
+0

Cảm ơn Steven, nhưng như bạn có thể thấy trong mã của tôi, tôi sử dụng UrlEncodedFormEntity (params, "UTF-8") tại trang web của khách hàng để mã hóa dữ liệu đối tượng của tôi và ở phía máy chủ, tôi đã sử dụng URLDecoder.decode (dữ liệu, "UTF-8") để giải mã. Nó hoạt động chính xác với các ký tự tiếng Nhật nhưng vấn đề chỉ xuất hiện khi tôi nhập một số ký tự như [# $% & '(<>? /.,] –

+0

cảm ơn nó đã làm việc như mong đợi hehehe: D – gumuruh

3
String data = request.getParameter(param1); 

Nếu đây là servlet API, các thông số đã được giải mã. Không cần xử lý thêm phần trăm mã hóa.


tôi đã không sử dụng HttpClient, nhưng đảm bảo nó được gửi mã hóa trong tiêu đề:

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

Hoặc, nếu bạn phải, thiết lập mã hóa được biết đến trước khi bất kỳ getParameter cuộc gọi:

request.setCharacterEncoding("UTF-8"); 
+0

Đặt loại nội dung này hoạt động cho tôi. –

+0

Đó là vàng! Cảm ơn rất nhiều – jiantongc

1

thử ổi

.210

com.google.common.net.UrlEscapers sử dụng

nó hoạt động tốt với Trung Quốc

như thế này:

Escaper escaper = UrlEscapers.urlFragmentEscaper(); 
String result = escaper.escape(yoururl); 
Các vấn đề liên quan