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){
}
}
}
Aber es funktioniert nicht richtig. Was ist das %3A und %2F Formate genannt und wie konvertiere ich sie?
@Stephen .. Warum kann eine URL keine UTF-8-codierte Zeichenfolge sein .. ?
– Crackerplatz
26. Mai 2011 um 12:14 Uhr
Das Problem ist, dass die Frage wirklich besteht, nur weil die URL UTF-8 sein kann nichts mit UTF-8 zu tun. Ich habe die Frage entsprechend bearbeitet.
– Chris Jester-Young
26. Mai 2011 um 12:19 Uhr
Es könnte (theoretisch) sein, aber die Zeichenfolge in Ihrem Beispiel ist keine UTF-8-codierte Zeichenfolge. Es ist eine URL-codierte ASCII-Zeichenfolge. Daher ist der Titel irreführend.
– Stefan C
26. Mai 2011 um 12:20 Uhr
Es ist auch erwähnenswert, dass alle Charaktere in der url Zeichenfolge sind ASCII, und dies gilt auch, nachdem die Zeichenfolge URL-dekodiert wurde. '%' ist ein ASCII-Zeichen und %xx stellt ein ASCII-Zeichen dar, wenn xx ist kleiner als (hexadezimal) 80.
– Stefan C
26. Mai 2011 um 12:34 Uhr
Jesper
Das hat nichts mit Zeichenkodierungen wie UTF-8 oder ASCII zu tun. Die Zeichenfolge, die Sie dort haben, ist URL-codiert. Diese Art der Kodierung ist etwas völlig anderes als die Zeichenkodierung.
Versuchen Sie so etwas:
try {
String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException e) {
// not going to happen - value came from JDK's own StandardCharsets
}
Java 10 hat direkte Unterstützung für hinzugefügt Charset an die API, was bedeutet, dass UnsupportedEncodingException nicht abgefangen werden muss:
String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8);
Beachten Sie, dass a Zeichenkodierung (wie UTF-8 oder ASCII) bestimmt die Zuordnung von Zeichen zu Rohbytes. Eine gute Einführung in die Zeichencodierung finden Sie unter Dieser Beitrag.
Die Methoden weiter URLDecoder sind statisch, sodass Sie keine neue Instanz davon erstellen müssen.
– faul
26. Mai 2011 um 12:37 Uhr
@Trismegistos Nur die Version, in der Sie die Zeichencodierung nicht angeben (der zweite Parameter, "UTF-8") ist gemäß der Java 7-API-Dokumentation veraltet. Verwenden Sie die Version mit zwei Parametern.
– Jesper
19. Dezember 2012 um 15:47 Uhr
Wenn Sie Java 1.7+ verwenden, können Sie die statische Version der Zeichenfolge “UTF-8” verwenden: StandardCharsets.UTF_8.name() aus diesem Paket: java.nio.charset.StandardCharsets. Passend dazu: Link
– Schahar
30. April 2014 um 12:46 Uhr
Zur Zeichencodierung ist dies auch ein großartiger Artikel balusc.blogspot.in/2009/05/unicode-how-to-get-characters-right.html
– Crackerplatz
16. Juli 2014 um 20:32 Uhr
Seien Sie vorsichtig damit. Wie hier angemerkt: blog.lunatech.com/2009/02/03/… Hier geht es nicht um URLs, sondern um die Kodierung von HTML-Formularen.
– Michael
27. Mai 2015 um 12:29 Uhr
Die Saite, die Sie haben, ist drin application/x-www-form-urlencoded Codierung.
Verwenden URLDecoder um es in einen Java-String zu konvertieren.
URLDecoder.decode( url, "UTF-8" );
Nick Greally
Dies wurde bereits beantwortet (obwohl diese Frage die erste war!):
“Sie sollten dazu java.net.URI verwenden, da die URLDecoder-Klasse x-www-form-urlencoded dekodiert, was falsch ist (trotz des Namens ist es für Formulardaten).”
Die empfohlene Methode zum Verwalten der Codierung und Decodierung von URLs ist die Verwendung URIund zum Konvertieren zwischen diesen beiden Klassen mit toURI() und URI.toURL().
Die URLEncoder und URLDecoder -Klassen können ebenfalls verwendet werden, aber nur für die HTML-Formularcodierung, die nicht mit dem in definierten Codierungsschema identisch ist RFC2396.
In Java 1.7 die URLDecoder.decode(String, String) Überladung ist nicht veraltet. Sie müssen sich auf die beziehen URLDecoder.decode(String) Überlastung ohne die Codierung. Vielleicht möchten Sie Ihren Beitrag zur Klarstellung aktualisieren.
– Aaron
18. August 2014 um 18:31 Uhr
Diese Antwort ist irreführend; Dieses Blockzitat hat nichts mit der Abwertung zu tun. Das Javadoc der veralteten Methode besagt, und ich zitiere tatsächlich @deprecated The resulting string may vary depending on the platform's default encoding. Instead, use the decode(String,String) method to specify the encoding.
– Emerson Farrugia
1. April 2015 um 10:30 Uhr
getPath() für URIs gibt nur den Pfadteil des URIs zurück, wie oben erwähnt.
– Pelpotronic
25. Juli 2016 um 20:33 Uhr
Wenn ich mich nicht irre, ist der “Pfad” bekanntermaßen der Teil einer URI nach dem Autoritätsteil (siehe: en.wikipedia.org/wiki/Uniform_Resource_Identifier für die Definition des Pfades) – es scheint mir, dass das Verhalten, das ich sehe, das Standard-/korrekte Verhalten ist. Ich verwende Java 1.8.0_101 (auf Android Studio). Ich wäre gespannt, was Sie bekommen, wenn “getAuthority()” aufgerufen wird. Sogar dieser Artikel/Beispiel scheint darauf hinzudeuten, dass Pfad nur der Teil /public/manual/appliances ihrer URI ist:quepublishing.com/articles/article.aspx?p=26566&seqNum=3
– Pelpotronic
27. Juli 2016 um 18:58 Uhr
@Pelpotronic Der Code in der Post druckt tatsächlich die Ausgabe, die er zeigt (zumindest für mich). Ich denke, der Grund dafür ist, dass der URI-Konstruktor aufgrund der URL-Codierung tatsächlich die gesamte Zeichenfolge behandelt (https%3A%2F...), als nur der Pfad eines URI; es gibt keine Berechtigung oder Abfrage usw. Dies kann durch Aufrufen der entsprechenden get-Methoden für das URI-Objekt getestet werden. Wenn Sie den decodierten Text an den URI-Konstruktor übergeben: new URI("https://mywebsite/do.....")dann anrufen getPath() und andere Methoden liefern korrekte Ergebnisse.
– Kröw
2. Juni 2019 um 2:26 Uhr
faul
%3A und %2F sind URL-kodierte Zeichen. Verwenden Sie diesen Java-Code, um sie wieder in zu konvertieren : und /
@Stephen .. Warum kann eine URL keine UTF-8-codierte Zeichenfolge sein .. ?
– Crackerplatz
26. Mai 2011 um 12:14 Uhr
Das Problem ist, dass die Frage wirklich besteht, nur weil die URL UTF-8 sein kann nichts mit UTF-8 zu tun. Ich habe die Frage entsprechend bearbeitet.
– Chris Jester-Young
26. Mai 2011 um 12:19 Uhr
Es könnte (theoretisch) sein, aber die Zeichenfolge in Ihrem Beispiel ist keine UTF-8-codierte Zeichenfolge. Es ist eine URL-codierte ASCII-Zeichenfolge. Daher ist der Titel irreführend.
– Stefan C
26. Mai 2011 um 12:20 Uhr
Es ist auch erwähnenswert, dass alle Charaktere in der
url
Zeichenfolge sind ASCII, und dies gilt auch, nachdem die Zeichenfolge URL-dekodiert wurde.'%'
ist ein ASCII-Zeichen und%xx
stellt ein ASCII-Zeichen dar, wennxx
ist kleiner als (hexadezimal)80
.– Stefan C
26. Mai 2011 um 12:34 Uhr