Here you can find the source of encode(String s)
public static String encode(String s)
//package com.java2s; /*//w w w . j a v a2 s. c o m * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.util.BitSet; public class Main { private static BitSet dontNeedEncoding; private final static int caseDiff = ('a' - 'A'); public static String encode(String s) { boolean needToChange = false; boolean wroteUnencodedChar = false; int maxBytesPerChar = 10; // rather arbitrary limit, but safe for now StringBuffer out = new StringBuffer(s.length()); ByteArrayOutputStream buf = new ByteArrayOutputStream(maxBytesPerChar); OutputStreamWriter writer; try { writer = new OutputStreamWriter(buf, "UTF-8"); } catch (UnsupportedEncodingException uee) { return null; } for (int i = 0; i < s.length(); i++) { int c = (int) s.charAt(i); if (dontNeedEncoding.get(c)) { if (c == ' ') { c = '+'; needToChange = true; } out.append((char) c); wroteUnencodedChar = true; } else { // convert to external encoding before hex conversion try { if (wroteUnencodedChar) { // Fix for 4407610 writer = new OutputStreamWriter(buf, "UTF-8"); wroteUnencodedChar = false; } writer.write(c); /* * If this character represents the start of a Unicode * surrogate pair, then pass in two characters. It's not * clear what should be done if a bytes reserved in the * surrogate pairs range occurs outside of a legal surrogate * pair. For now, just treat it as if it were any other * character. */ if (c >= 0xD800 && c <= 0xDBFF) { /* * (Integer.toHexString(c) + " is high * surrogate"); */ if ((i + 1) < s.length()) { int d = (int) s.charAt(i + 1); /* * ("\tExamining " + * Integer.toHexString(d)); */ if (d >= 0xDC00 && d <= 0xDFFF) { /* * ("\t" + * Integer.toHexString(d) + " is low * surrogate"); */ writer.write(d); i++; } } } writer.flush(); } catch (IOException e) { buf.reset(); continue; } byte[] bufferBytes = buf.toByteArray(); for (byte bufferByte : bufferBytes) { out.append('%'); char ch = Character.forDigit((bufferByte >> 4) & 0xF, 16); // converting to use uppercase letter as part of // the hex value if ch is a letter. if (Character.isLetter(ch)) { ch -= caseDiff; } out.append(ch); ch = Character.forDigit(bufferByte & 0xF, 16); if (Character.isLetter(ch)) { ch -= caseDiff; } out.append(ch); } buf.reset(); needToChange = true; } } return (needToChange ? out.toString() : s); } }