Bạn nên thực tế là URI-encode ký tự "không hợp lệ". Vì chuỗi thực sự chứa URL hoàn chỉnh, thật khó để mã hóa URI đúng cách. Bạn không biết những dấu gạch chéo /
nên được đưa vào tài khoản và không. Bạn không thể dự đoán trước đó trên String
thô. Vấn đề thực sự cần phải được giải quyết ở cấp độ cao hơn. Trường hợp đó String
đến từ đâu? Nó có được mã hóa không? Sau đó, chỉ cần thay đổi nó cho mình cho phù hợp. Liệu nó có phải là đầu vào của người dùng không? Xác nhận nó và hiển thị lỗi, cho phép người dùng tự giải quyết.
Tại bất kỳ cách nào, nếu bạn có thể đảm bảo rằng nó chỉ các khoảng trắng trong URL mà làm cho nó không hợp lệ, sau đó bạn cũng có thể chỉ cần làm một chuỗi theo chuỗi thay thế với %20
:
URI uri = new URI(string.replace(" ", "%20"));
hoặc nếu bạn có thể đảm bảo rằng nó chỉ phần sau dấu gạch chéo cuối cùng mà cần phải được URI mã hóa, sau đó bạn có thể cũng chỉ làm như vậy với sự giúp đỡ của lớp android.net.Uri
tiện ích:
int pos = string.lastIndexOf('/') + 1;
URI uri = new URI(string.substring(0, pos) + Uri.encode(string.substring(pos)));
Lưu ý rằng URLEncoder
không phù hợp với tác vụ vì nó được thiết kế để mã hóa các tên/giá trị tham số chuỗi truy vấn theo các quy tắc application/x-www-form-urlencoded
(như được sử dụng trong biểu mẫu HTML). Xem thêm Java URL encoding of query string parameters.
Thay thế các khoảng trống bằng '% 20'. THX – Mannaz
@Mannaz - chỉ cần cẩn thận khi một biểu tượng "không hợp lệ" khác xuất hiện trong tên bài hát. – Bozho
@BalusC tôi đã thử URLEncoder.encode ("chuỗi truy vấn", "UTF-8"); nó quay trở lại với biểu tượng + như "truy vấn + chuỗi" này, nơi im mong đợi "% 20". Vì vậy, tôi đã sử dụng string.replace với hardcoded các giá trị. Giải quyết vấn đề. Cảm ơn bạn về thông tin. Có cách nào khác để mã hóa thay vì thay thế thủ công ..? – praveenb