10. september 2003 - 11:51
Der er
15 kommentarer og 1 løsning
Hvilket charset følger RFC 1738
Jeg skal med... URLEncoder.encode(String s, String enc); ... have encodet jf RFC1738-standarden, men hvad hedder det charset, der følger den? F.eks. følger UTF-8 RFC2279...
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
10. september 2003 - 12:11
#2
Encodingen selv hedder bare URL encoding. Output fra den encoding er US-ASCII. Det andet argument angiver hvilket encoding der bruges som "midlertidig tilstand". Altså: 1 tegn --(ISO-8859-1 encoding)--> 1 byte --(URL encoding)--> %nn 1 tegn --(UTF-8 encoding)--> 2 bytes --(URL encoding)--> %nn%mm
10. september 2003 - 12:20
#3
Problemet med UTF-8 er, at spaces erstattes med '+' jf. RF2279, men jeg skal bruge '%20' i stedet, jf. RFC1738....
10. september 2003 - 12:36
#4
Øh. Håndteringen af space har næppe noget med UTF-8 versus ISO-8859-1 at gøre. Det er kun >=128 tegnene det påvirker. Hvis jeg husker rigtigt så skal man bruge %20 før ? og + efter ?. Men jeg har lige testet og du har ret URLEncoder er meget glad for + !
10. september 2003 - 13:08
#5
Det er fordi + erstatter space jf. RFC 2279. Men jf. RFC1738 erstatter %20 space... Hvilket charset er det så man skal bruge for at gøre dette?
10. september 2003 - 13:20
#6
Det har intet med karakter sæt at gøre. Og jeg forstår ikke det med RFC'erne. RFC 2279 er en generel beskrivelse af UTF-8 og har mig bekendt intet med URL'er at gøre. RFC 1738 bruger %20 men går ikke ind i detaljer om før og efter ? i HTTP.
10. september 2003 - 13:31
#7
Men da URLEncode encode tilsyneladende er lavet til brug for form data, så er det vel ike andet for end at du laver din egen lille replaceAll !?
10. september 2003 - 13:50
#8
Du tænker altså på med String.replaceAll erstatte alle + med %20 - men hvordan ved jeg at RFC2279 udover space gør det samme som RFC1738 ? Og hvordan skriver man det egentlig ? String myString = "..."; myString = myString.replaceAll("+", "%20"); Sidste linie smider nemlig en PatternSyntaxException...
10. september 2003 - 19:47
#9
Jeg ville kalde replaceALl først. Eksempel: import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class Enc { public static void main(String[] args) throws Exception { System.out.println(URLEncoder.encode("Æ Ø Å", "UTF-8")); System.out.println(specialEncode("Æ Ø Å")); } public static String specialEncode(String s) throws UnsupportedEncodingException { return URLEncoder.encode(s.replaceAll(" ", "%20"), "UTF-8"); } }
10. september 2003 - 19:48
#10
I modsætning til hvad man umiddelbart tror så er det første argument til replaceAll ig en normal søge-streng men en regular expression. Og + har en speciel betydning i regular expressions.
10. september 2003 - 22:23
#11
specialEncode vil vel ikke virke i praksis, da strengen vil blive dobbelt-encodet. Space vil først blive erstattet af %20, og derefter vil '%' igen blive encodet...
10. september 2003 - 22:27
#12
Det har du ret i. Men så vender vi den bare om og escaper plus: import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class Enc { public static void main(String[] args) throws Exception { System.out.println(URLEncoder.encode("Æ Ø Å", "UTF-8")); System.out.println(specialEncode("Æ Ø Å")); } public static String specialEncode(String s) throws UnsupportedEncodingException { return URLEncoder.encode(s, "UTF-8").replaceAll("\\+", "%20"); } }
10. september 2003 - 23:13
#13
Ahhh det er "\\+" man skal skrive, kunne nemlig ikke få det til at virke med "+" :)
10. september 2003 - 23:14
#14
Fordi det har en betydning ja...
27. september 2003 - 13:45
#15
Ja. replaceAll bruger regex. Tid at lukke ?
27. september 2003 - 18:48
#16
Jep, det må det være. Forskellen på 2279 og 1738 er meget mere end '+' og '%20'. Jeg tyvstjal 1738-encoderen fra Netscape :)
Kurser inden for grundlæggende programmering