# HG changeset patch # User Jaroslav Tulach # Date 1362154893 -3600 # Node ID b975b19621c64aae4684ae99818d4e556ffa49bb # Parent 8b3a9f510a9bf1789902598090c3a3800441fac9 Encode UTF-8 bytes, not characters diff -r 8b3a9f510a9b -r b975b19621c6 rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java --- a/rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java Fri Mar 01 17:20:56 2013 +0100 +++ b/rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java Fri Mar 01 17:21:33 2013 +0100 @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -131,12 +132,15 @@ } } - private static String encodeURL(String r) { + private static String encodeURL(String r) throws UnsupportedEncodingException { + final String SPECIAL = "%$&+,/:;=?@"; StringBuilder sb = new StringBuilder(); - for (int i = 0; i < r.length(); i++) { - int ch = r.charAt(i); - if (ch < 32 || ch == '%' || ch == '+') { - sb.append("%").append(("0" + Integer.toHexString(ch)).substring(0, 2)); + byte[] utf8 = r.getBytes("UTF-8"); + for (int i = 0; i < utf8.length; i++) { + int ch = utf8[i] & 0xff; + if (ch < 32 || ch > 127 || SPECIAL.indexOf(ch) >= 0) { + final String numbers = "0" + Integer.toHexString(ch); + sb.append("%").append(numbers.substring(numbers.length() - 2)); } else { if (ch == 32) { sb.append("+");