Ich habe mit verschiedenen Teilen von Java-Code experimentiert, um etwas zu finden, das eine Zeichenfolge mit Anführungszeichen, Leerzeichen und "exotischen" Unicode-Zeichen codiert und eine Ausgabe erzeugt, die mit der Funktion encodeURIComponent von JavaScript identisch ist.
Mein Folterteststring lautet: "A" B ± "
Wenn ich in Firebug die folgende JavaScript-Anweisung eingebe:
encodeURIComponent('"A" B ± "');
- Dann bekomme ich:
"%22A%22%20B%20%C2%B1%20%22"
Hier ist mein kleines Test-Java-Programm:
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class EncodingTest
{
public static void main(String[] args) throws UnsupportedEncodingException
{
String s = "\"A\" B ± \"";
System.out.println("URLEncoder.encode returns "
+ URLEncoder.encode(s, "UTF-8"));
System.out.println("getBytes returns "
+ new String(s.getBytes("UTF-8"), "ISO-8859-1"));
}
}
- Dieses Programm gibt Folgendes aus:
URLEncoder.encode gibt% 22A% 22 + B +% C2% B1 +% 22 zurück getBytes gibt "A" B ± "zurück.
Nah dran, aber keine Zigarre! Was ist der beste Weg, um eine UTF-8-Zeichenfolge mit Java so zu codieren, dass sie dieselbe Ausgabe wie JavaScript erzeugt encodeURIComponent
?
BEARBEITEN: Ich verwende Java 1.4 und wechsle in Kürze zu Java 5.
quelle
[~'()!]
bedeutet"~"
oder"'"
oder"("
oder")"
oder"!"
. :) Ich empfehle jedoch auch, die Regex-Grundlagen zu lernen. (Ich habe das auch nicht erweitert, da mindestens zwei andere Antworten den jeweiligen Java-Code zeigen.)"+"
durch"%20"
ist möglicherweise destruktiv, ebenso"+"
wie ein zulässiges Zeichen in URI-Pfaden (jedoch nicht in der Abfragezeichenfolge). Zum Beispiel sollte "a + b c" codiert werden als"a+b%20c"
; Diese Lösung würde es in konvertieren"a%20b%20c"
. Verwenden Sie stattdessennew URI(null, null, value, null).getRawPath()
.Dies ist die Klasse, die ich mir am Ende ausgedacht habe:
quelle
%0A
was eine Eingabetaste in der Android-Eingabe bedeutet, sonst stürzt das js ab."%0A"
? Welcher Charakter wäre der Ersatz? Ist es nur eine leere Zeichenfolge""
?Verwenden der mit Java 6 gelieferten Javascript-Engine:
Ausgabe:% 22A% 22% 20B% 20% c2% b1% 20% 22
Der Fall ist anders, aber näher an dem, was Sie wollen.
quelle
Ich benutze
java.net.URI#getRawPath()
zBDer Wert von
fixed
wird seina+b%20c.html
, was Sie wollen.Post-Verarbeitung der Ausgabe von
URLEncoder.encode()
werden alle Pluspunkte auszulöschen, die angeblich in der URI sein. Beispielsweisewird Ihnen geben
a%20b%20c.html
, was als interpretiert wirda b c.html
.quelle
http://a+b c.html
, es wird einen FehlerIch habe meine eigene Version der encodeURIComponent entwickelt, da die veröffentlichte Lösung ein Problem hat: Wenn in der Zeichenfolge ein + vorhanden ist, das codiert werden soll, wird sie in ein Leerzeichen konvertiert.
Also hier ist meine Klasse:
quelle
URLEncoder.encode("+", "UTF-8");
ergibt"%2B"
, was die richtige URL-Codierung ist, also ist Ihre Lösung, ich entschuldige mich, völlig unnötig. Warum um alles in der Welt?URLEncoder.encode
der Welt keine Räume werden,%20
ist mir ein Rätsel.Ich habe eine weitere Implementierung entwickelt, die unter http://blog.sangupta.com/2010/05/encodeuricomponent-and.html dokumentiert ist . Die Implementierung kann auch Unicode-Bytes verarbeiten.
quelle
Ich habe die Klasse java.net.URI erfolgreich wie folgt verwendet:
quelle
Dies ist ein einfaches Beispiel für die Lösung von Ravi Wallau:
Ausgabe:
https://www.website.com/document/Tom%20%26%20Jerry%20Manuscript.pdf
Es beantwortet auch die hängende Frage in den Kommentaren von Loren Shqipognja, wie eine String-Variable übergeben werden soll
encodeURIComponent()
. Die MethodescriptEngine.eval()
gibt ein zurückObject
, sodass sieString.valueOf()
unter anderem über String konvertiert werden kann .quelle
bei mir hat das geklappt:
oder mit einem anderen UriBuilder
Meiner Meinung nach ist die Verwendung einer Standardbibliothek eine bessere Idee als die manuelle Nachbearbeitung. Auch die Antwort von @Chris sah gut aus, funktioniert aber nicht für URLs wie " http: // a + b c.html".
quelle
encodeURIComponent
.encodeURIComponent
gibt?&
das Ergebnis zurück%3F%26%20
, aber Ihr Vorschlag kehrt zurück%3F%26+
. Ich weiß, dass dies in anderen Fragen und Antworten mehrfach erwähnt wird, sollte aber hier erwähnt werden, bevor die Leute ihm blind vertrauen.Folgendes verwende ich:
Es geht über Javascript hinaus, indem jedes Zeichen, das gemäß RFC 3986 kein nicht reserviertes Zeichen ist, prozentual codiert wird .
Dies ist die entgegengesetzte Umwandlung:
quelle
Ich habe die PercentEscaper-Klasse aus der Google-http-Java-Client-Bibliothek gefunden, mit der encodeURIComponent ganz einfach implementiert werden kann.
PercentEscaper von google-http-java-client javadoc google-http-java-client home
quelle
Die Guavenbibliothek hat PercentEscaper:
Escaper percentEscaper = new PercentEscaper("-_.*", false);
"-_. *" sind sichere Zeichen
false sagt PercentEscaper, dass er mit '% 20' und nicht mit '+' dem Leerzeichen entkommen soll.
quelle
Ich habe
String encodedUrl = new URI(null, url, null).toASCIIString();
URLs verschlüsselt. Um Parameter nach den vorhandenen in der vonurl
mir verwendeten hinzuzufügenUriComponentsBuilder
quelle