Mühe Prozent-Codierung Räume in Java
Ich bin mit dem URLUTF8Encoder.java Klasse vom W3C (www.w3.org/International/URLUTF8Encoder.java).
Derzeit, es kodiert Leerzeichen '' in einem plus-Zeichen '+'.
Ich habe Schwierigkeiten den code zu ändern, Prozent-Kodieren, das Leerzeichen in "%20'. Leider bin ich nicht allzu vertraut mit hex. Kann jemand mir helfen? Muss ich zum ändern dieses snippet...
else if (ch == ' ') { //space
sbuf.append('+');
in den folgenden code:
final static String[] hex = { "%00", "%01", "%02", "%03", "%04", "%05",
"%06", "%07", "%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E",
"%0F", "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
"%18", "%19", "%1A", "%1B", "%1C", "%1D", "%1E", "%1F", "%20",
"%21", "%22", "%23", "%24", "%25", "%26", "%27", "%28", "%29",
"%2A", "%2B", "%2C", "%2D", "%2E", "%2F", "%30", "%31", "%32",
"%33", "%34", "%35", "%36", "%37", "%38", "%39", "%3A", "%3B",
"%3C", "%3D", "%3E", "%3F", "%40", "%41", "%42", "%43", "%44",
"%45", "%46", "%47", "%48", "%49", "%4A", "%4B", "%4C", "%4D",
"%4E", "%4F", "%50", "%51", "%52", "%53", "%54", "%55", "%56",
"%57", "%58", "%59", "%5A", "%5B", "%5C", "%5D", "%5E", "%5F",
"%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67", "%68",
"%69", "%6A", "%6B", "%6C", "%6D", "%6E", "%6F", "%70", "%71",
"%72", "%73", "%74", "%75", "%76", "%77", "%78", "%79", "%7A",
"%7B", "%7C", "%7D", "%7E", "%7F", "%80", "%81", "%82", "%83",
"%84", "%85", "%86", "%87", "%88", "%89", "%8A", "%8B", "%8C",
"%8D", "%8E", "%8F", "%90", "%91", "%92", "%93", "%94", "%95",
"%96", "%97", "%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E",
"%9F", "%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7",
"%A8", "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF", "%B0",
"%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7", "%B8", "%B9",
"%BA", "%BB", "%BC", "%BD", "%BE", "%BF", "%C0", "%C1", "%C2",
"%C3", "%C4", "%C5", "%C6", "%C7", "%C8", "%C9", "%CA", "%CB",
"%CC", "%CD", "%CE", "%CF", "%D0", "%D1", "%D2", "%D3", "%D4",
"%D5", "%D6", "%D7", "%D8", "%D9", "%DA", "%DB", "%DC", "%DD",
"%DE", "%DF", "%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6",
"%E7", "%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF",
"%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7", "%F8",
"%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF" };
public static String encode(String s) {
StringBuffer sbuf = new StringBuffer();
int len = s.length();
for (int i = 0; i < len; i++) {
int ch = s.charAt(i);
if ('A' <= ch && ch <= 'Z') { //'A'..'Z'
sbuf.append((char) ch);
} else if ('a' <= ch && ch <= 'z') { //'a'..'z'
sbuf.append((char) ch);
} else if ('0' <= ch && ch <= '9') { //'0'..'9'
sbuf.append((char) ch);
} else if (ch == ' ') { //space
sbuf.append('+');
} else if (ch == '-'
|| ch == '_' //unreserved
|| ch == '.' || ch == '!' || ch == '~' || ch == '*'
|| ch == '\'' || ch == '(' || ch == ')') {
sbuf.append((char) ch);
} else if (ch <= 0x007f) { //other ASCII
sbuf.append(hex[ch]);
} else if (ch <= 0x07FF) { //non-ASCII <= 0x7FF
sbuf.append(hex[0xc0 | (ch >> 6)]);
sbuf.append(hex[0x80 | (ch & 0x3F)]);
} else { //0x7FF < ch <= 0xFFFF
sbuf.append(hex[0xe0 | (ch >> 12)]);
sbuf.append(hex[0x80 | ((ch >> 6) & 0x3F)]);
sbuf.append(hex[0x80 | (ch & 0x3F)]);
}
}
return sbuf.toString();
}
Dank!
- warum brauchen Sie das + sein %20? Sie sind beide gleichwertig? permadi.com/tutorial/urlEncoding
- Bitte siehe meine Antwort weiter unten, danke.
- lollipop: Ach, Nein. HTTP sagt, es sollte sein
%20
, es ist der HTML-Spezifikation, die ermöglicht + statt Leerzeichen. So, example.com/something%20here.php?q=a+string+mit+Leerzeichen ist gültig, aber example.com/something+hier.php?q=a+string+mit+Leerzeichen nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich werde nicht Fragen, warum Sie das tun, und beantworte nur Ihre Frage direkt. Lesen Sie bitte andere Antworten, um zu bestimmen, wenn Sie wirklich wollen, um änderungen am code. Wenn Sie entfernen Sie einfach den code:
Wird es tun, was Sie wollen, denn die Leerzeichen werden übernommen, indem Sie den code:
Möchten Sie vielleicht zu prüfen, aus Apache-Common codec-Paket, dass es wahrscheinlich eine Menge mehr robust : http://commons.apache.org/codec/ - das Paket, Das Sie verwenden, ist ungefähr 14 Jahre alt und nur das kodiert, in eine Art der Codierung (www-url-form-encoded) - das ERFORDERT spaces codiert als '+'. Wenn Sie versuchen, tun Sie die standard-URL-Kodierung (will das Leerzeichen als "%20"), benötigen Sie ein anderes Paket vollständig.
Warum verwenden Sie diese Klasse statt der API-Methode?
java.net.URLEncoder.encode("your string", "utf-8");
Und warum ist es ein problem, dass Leerzeichen codiert sind, wie + Zeichen? Das ist genau, wie URL-sichere Zeichenkodierung funktionieren soll.
else if (ch == ' ') { sbuf.append('+'); }
) in den code eingefügt haben? In diesem Fall Räume fallen sollte in die "andere ASCII-Zweig" und kodiert werden, wie Sie es erwarten.Nur dazu:
Er richtig funktioniert; sollte es mit + als auch mit %20.
Vielleicht versuchen
java.net.URLEncoder("url", "UTF-8")
?