2010-09-17 40 views
14

Tôi đang sử dụng chế độ xem lưới để hiển thị hình ảnh bằng cách sử dụng phân tích cú pháp xml, tôi có một số ngoại lệ như java.lang.IllegalArgumentException: Illegal character in path at index 80: http://www.theblacksheeponline.com/party_img/thumbspps/912big_361999096_Flicking Off Douchebag.jpg, cách giải quyết vấn đề này ?, tôi muốn hiển thị tất cả các loại url, bất kỳ ai biết vui lòng cung cấp mã mẫu cho tôi ..làm thế nào để mã hóa url trong android?

Cảm ơn tất cả

+0

Một URL với một không gian trắng thay vì% 20 là một URL bất hợp pháp. Vì vậy, bạn cần một trình phân tích cú pháp cho các url bị hỏng (trừ khi bạn có thể thay đổi chúng theo cách thủ công trước khi phân tích cú pháp). – LatinSuD

+1

Bản sao có thể có của [Mã hóa Url trong Android] (http://stackoverflow.com/questions/3286067/url-encoding-in-android) – blahdiblah

Trả lời

29

Mã hóa URL được thực hiện theo cách tương tự trên Android như trong Java SE;

try { 
    String url = "http://www.example.com/?id=123&art=abc"; 
    String encodedurl = URLEncoder.encode(url,"UTF-8"); 
    Log.d("TEST", encodedurl); 
} catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
} 
+0

@http: //www.theblacksheeponline.com/party_img/thumbspps/12390867930_15951_186997180114_709920114_4296270_6115611_n [1 ] .jpg Làm cách nào tôi có thể mã hóa loại url này? vui lòng cung cấp mã mẫu cho tôi .. – sivaraj

+36

Ví dụ đó xuất URL: http% 3A% 2F% 2Fwww.example.com% 2F% 3Fid% 3D123% 26art% 3Dabc. Đó không phải là một URL hợp lệ. Phương thức URLEncoder.encode là để mã hóa các giá trị chuỗi truy vấn chứ không phải toàn bộ URL. Trích dẫn từ tài liệu: 'Lớp này chứa các phương thức tĩnh để chuyển đổi một chuỗi thành định dạng MIME ứng dụng/x-www-form-urlencoded' –

+4

Đó không phải là một mã hóa hợp lệ. Nhìn vào câu trả lời ở đây: http://stackoverflow.com/questions/3286067/url-encoding-in-android –

5

Như Ben nói trong comment của mình, bạn không nên sử dụng URLEncoder.encode URL đầy đủ bởi vì bạn sẽ thay đổi ngữ nghĩa của các URL mỗi ví dụ sau từ W3C:

Các URI http://www.w3.org/albert/bertram/marie-claudehttp://www.w3.org/albert/bertram%2Fmarie-claude KHÔNG giống hệt nhau, như trong trường hợp thứ hai trường hợp dấu gạch chéo được mã hóa không có ý nghĩa phân cấp.

Thay vào đó, bạn nên mã hóa bộ phận cấu thành của một URL một cách độc lập theo sau từ RFC 3986 Mục 2,4

Trong những trường hợp bình thường, chỉ thời gian khi octet trong một URI là trăm mã hóa là trong quy trình sản xuất URI từ các bộ phận thành phần của nó. Đây là khi triển khai thực hiện xác định các ký tự dành riêng cho được sử dụng làm dấu phân cách thành phần phụ và có thể sử dụng an toàn làm dữ liệu . Khi đã sản xuất , URI luôn ở dạng dạng mã hóa phần trăm.

Vì vậy, trong trường hợp của bạn, bạn nên mã hóa/thoát tên tệp và sau đó lắp ráp URL.

-1

Gần đây tôi đã viết bộ mã hóa URI nhanh cho mục đích này. Nó thậm chí xử lý các ký tự unicode. http://www.dmurph.com/2011/01/java-uri-encoder/

+3

Thật là một sự lãng phí thời gian. ;) Android cũng có một lớp Uri. –

1

URLEncoder nên chỉ được sử dụng để mã hóa các truy vấn, sử dụng java.net.URI lớp thay vì:

 
URI uri = new URI(
    "http", 
    "www.theblacksheeponline.com", 
    "/party_img/thumbspps/912big_361999096_Flicking Off Douchebag.jpg", 
    null); 
String request = uri.toASCIIString(); 
11

Ngoài ra bạn có thể sử dụng

private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%"; 
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS); 

đó là phương pháp đơn giản nhất

+1

Giải pháp tuyệt vời. Bạn đã đến danh sách 'ALLOWED_URI_CHARS' bằng cách nào? – user1032613

+0

Ngoài ra còn có quá tải không sử dụng 'ALLOWED_URI_CHARS' – lionello

+0

hoạt động: D cảm ơn – A7madev

3

Bạn don 't mã hóa toàn bộ toàn bộ URL, chỉ phần của nó đến từ "nguồn không đáng tin cậy" như thế nào.

String query = URLEncoder.encode("Hare Krishna ", "utf-8"); 
String url = "http://stackoverflow.com/search?q=" + query; 
0

bạn có thể sử dụng phương pháp dưới đây

public String parseURL(String url, Map<String, String> params) 
{ 
    Builder builder = Uri.parse(url).buildUpon(); 
    for (String key : params.keySet()) 
    { 
     builder.appendQueryParameter(key, params.get(key)); 
    } 
    return builder.build().toString(); 
} 
Các vấn đề liên quan