Powinieneś w rzeczywistości URI-encode "nieważne" znaki. Ponieważ ciąg faktycznie zawiera pełny adres URL, trudno jest go poprawnie kodować URI. Nie wiesz, które ukośniki należy wziąć pod uwagę, a które nie. Nie można tego wcześniej przewidzieć na surowym String
. Problem naprawdę musi zostać rozwiązany na wyższym poziomie. Skąd pochodzi String
? Czy to jest na stałe? Następnie zmień to odpowiednio. Czy przychodzi jako dane wejściowe użytkownika? Sprawdź poprawność i pokaż błąd, pozwól użytkownikowi rozwiązać problem.
w jakikolwiek sposób, jeśli można zapewnić, że to są tylko przestrzenie w URL, który sprawia, że jest nieważny, to można też po prostu zrobić łańcuch po ciąg zastąpić %20
:
URI uri = new URI(string.replace(" ", "%20"));
lub jeśli można zapewnić, że to tylko część po ostatnim ukośniku który musi być zakodowany URI, to można też po prostu zrobić z pomocą klasy android.net.Uri
użytkowy:
int pos = string.lastIndexOf('/') + 1;
URI uri = new URI(string.substring(0, pos) + Uri.encode(string.substring(pos)));
Należy zauważyć, że URLEncoder
nie nadaje się do zadania, ponieważ jest przeznaczony do kodowania nazw/wartości parametrów ciągów zapytań zgodnie z regułami application/x-www-form-urlencoded
(używanymi w formularzach HTML). Zobacz także Java URL encoding of query string parameters.
Zamieniając spacje na '% 20' wykonaj sztuczkę. THX – Mannaz
@Mannaz - zachowaj ostrożność, gdy w nazwie utworu pojawi się inny "nieważny" symbol. – Bozho
@BalusC wypróbowałem URLEncoder.encode ("ciąg zapytania", "UTF-8"); powraca z symbolem + takim jak "zapytanie + ciąg", w którym się spodziewam "% 20". Więc użyłem string.replace z zakodowanymi na stałe wartościami. Rozwiązano problem. Dzięki za informację. Czy jest jakiś inny sposób kodowania zamiast ręcznej zamiany ...? – praveenb