W Javie chcę przekonwertować to:
https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type
Do tego:
https://mywebsite/docs/english/site/mybook.do&request_type
Oto co mam do tej pory:
class StringUTF
{
public static void main(String[] args)
{
try{
String url =
"https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do" +
"%3Frequest_type%3D%26type%3Dprivate";
System.out.println(url+"Hello World!------->" +
new String(url.getBytes("UTF-8"),"ASCII"));
}
catch(Exception E){
}
}
}
Ale to nie działa dobrze. Jak nazywają się te %3A
i %2F
formaty i jak je przekonwertować?
java
url-encoding
crackerplace
źródło
źródło
url
ciągu są ASCII, i jest to prawdą również po zdekodowaniu ciągu.'%'
jest znakiem ASCII i%xx
reprezentuje znak ASCII, jeślixx
jest mniejszy niż (szesnastkowy)80
.Odpowiedzi:
Nie ma to nic wspólnego z kodowaniem znaków, takich jak UTF-8 lub ASCII. Ciąg, który tam masz, jest zakodowany w adresie URL . Ten rodzaj kodowania jest czymś zupełnie innym niż kodowanie znaków.
Wypróbuj coś takiego:
Java 10 dodała bezpośrednie wsparcie dla
Charset
API, co oznacza, że nie ma potrzeby wychwytywania wyjątku UnsupportedEncodingException:Zauważ, że kodowanie znaków (takie jak UTF-8 lub ASCII) decyduje o odwzorowaniu znaków na surowe bajty. Dobre wprowadzenie do kodowania znaków znajduje się w tym artykule .
źródło
URLDecoder
są statyczne, więc nie musisz tworzyć nowej instancji."UTF-8"
) jest nieaktualna zgodnie z dokumentacją interfejsu API języka Java 7. Użyj wersji z dwoma parametrami.StandardCharsets.UTF_8.name()
z tego pakietu:java.nio.charset.StandardCharsets
. Odpowiedni do tego: linkCiąg, który masz, jest
application/x-www-form-urlencoded
kodowany.Użyj URLDecoder, aby przekonwertować go na ciąg Java.
źródło
To zostało odebrane przed (choć ta kwestia była pierwsza!):
Jak stwierdza dokumentacja klasy URL :
Gruntownie:
da tobie:
źródło
URLDecoder.decode(String, String)
przeciążenie nie jest przestarzałe. Musisz odnosić się doURLDecoder.decode(String)
przeciążenia bez kodowania. Możesz zaktualizować swój post dla wyjaśnienia.@deprecated The resulting string may vary depending on the platform's default encoding. Instead, use the decode(String,String) method to specify the encoding.
https%3A%2F...
) jako tylko ścieżkę URI; nie ma uprawnień ani zapytań itp. Można to przetestować, wywołując odpowiednie metody get na obiekcie URI. Jeśli przekażesz zdekodowany tekst do konstruktora URI:,new URI("https://mywebsite/do.....")
wówczas wywołaniegetPath()
i inne metody dadzą poprawne wyniki.%3A
i%2F
są znakami zakodowanymi w adresie URL. Użyj tego kodu Java, aby przekonwertować je z powrotem na:
i/
źródło
źródło
źródło
Używam apache commons
Domyślny zestaw znaków to
UTF-8
źródło
Możesz mądrze wybrać metodę :)
źródło
Za pomocą klasy java.net.URI:
Pamiętaj, że obsługa wyjątków może być lepsza, ale nie ma to większego znaczenia w tym przykładzie.
źródło