1.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java Tue Sep 24 13:48:12 2013 -0700 1.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java Tue Sep 24 16:12:06 2013 -0700 1.3 @@ -28,6 +28,7 @@ 1.4 import java.io.IOException; 1.5 import java.io.Writer; 1.6 import java.util.*; 1.7 +import java.nio.charset.*; 1.8 1.9 import com.sun.tools.doclets.internal.toolkit.Content; 1.10 import com.sun.tools.doclets.internal.toolkit.util.*; 1.11 @@ -164,6 +165,46 @@ 1.12 } 1.13 1.14 /** 1.15 + * A set of ASCII URI characters to be left unencoded. 1.16 + */ 1.17 + public static BitSet NONENCODING_CHARS = new BitSet(256); 1.18 + 1.19 + static { 1.20 + // alphabetic characters 1.21 + for (int i = 'a'; i <= 'z'; i++) { 1.22 + NONENCODING_CHARS.set(i); 1.23 + } 1.24 + for (int i = 'A'; i <= 'Z'; i++) { 1.25 + NONENCODING_CHARS.set(i); 1.26 + } 1.27 + // numeric characters 1.28 + for (int i = '0'; i <= '9'; i++) { 1.29 + NONENCODING_CHARS.set(i); 1.30 + } 1.31 + // Reserved characters as per RFC 3986. These are set of delimiting characters. 1.32 + String noEnc = ":/?#[]@!$&'()*+,;="; 1.33 + // Unreserved characters as per RFC 3986 which should not be percent encoded. 1.34 + noEnc += "-._~"; 1.35 + for (int i = 0; i < noEnc.length(); i++) { 1.36 + NONENCODING_CHARS.set(noEnc.charAt(i)); 1.37 + } 1.38 + } 1.39 + 1.40 + private static String encodeURL(String url) { 1.41 + byte[] urlBytes = url.getBytes(Charset.forName("UTF-8")); 1.42 + StringBuilder sb = new StringBuilder(); 1.43 + for (int i = 0; i < urlBytes.length; i++) { 1.44 + int c = urlBytes[i]; 1.45 + if (NONENCODING_CHARS.get(c & 0xFF)) { 1.46 + sb.append((char) c); 1.47 + } else { 1.48 + sb.append(String.format("%%%02X", c & 0xFF)); 1.49 + } 1.50 + } 1.51 + return sb.toString(); 1.52 + } 1.53 + 1.54 + /** 1.55 * Generates an HTML anchor tag. 1.56 * 1.57 * @param ref reference url for the anchor tag 1.58 @@ -172,7 +213,7 @@ 1.59 */ 1.60 public static HtmlTree A(String ref, Content body) { 1.61 HtmlTree htmltree = new HtmlTree(HtmlTag.A, nullCheck(body)); 1.62 - htmltree.addAttr(HtmlAttr.HREF, ref); 1.63 + htmltree.addAttr(HtmlAttr.HREF, encodeURL(ref)); 1.64 return htmltree; 1.65 } 1.66