/* * Copyright 2003 Federal Chancellery Austria * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.gv.egovernment.moa.util; import java.io.ByteArrayInputStream; import java.io.StringWriter; import java.io.UnsupportedEncodingException; /** * Translates a string into mime format "x-www-form-urlencoded". * Provides a function missing in JDK 1.3. * @author Paul Ivancsics * @version $Id$ */ public class URLEncoder { /** * Translates a string into x-www-form-urlencoded format. * @param s the string to be translated * @param encoding the encoding to use * @return the translated string * @throws UnsupportedEncodingException when the desired encoding is not supported */ public static String encode(String s, String encoding) throws UnsupportedEncodingException { byte[] barr = s.getBytes(encoding); ByteArrayInputStream bin = new ByteArrayInputStream(barr); StringWriter out = new StringWriter(); for (int b = bin.read(); b >= 0; b = bin.read()) encode(b, out); return out.toString(); } /** * Encode a character. * @param ch The character to encode. * @param out The StringWriter containing the result. */ private static void encode(int ch, StringWriter out) { if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == '.' || ch == '-' || ch == '*' || ch == '_') out.write(ch); else if (ch == ' ') out.write('+'); else encodeHex(ch, out); } /** * Encode a character as an escaped hex value. * @param ch The character to encode. * @param out The StringWriter containing the result. */ private static void encodeHex(int ch, StringWriter out) { out.write('%'); String hex = Integer.toHexString(ch).toUpperCase(); if (hex.length() < 2) out.write('0'); else out.write(hex.charAt(hex.length() - 2)); out.write(hex.charAt(hex.length() - 1)); } }