A method to decode/encode quoted printable encoded data : String « Date Type « Android

A method to decode/encode quoted printable encoded data

 * Funambol is a mobile platform developed by Funambol, Inc.
 * Copyright (C) 2003 - 2007 Funambol, Inc.
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 * You should have received a copy of the GNU Affero General Public License
 * along with this program; if not, see http://www.gnu.org/licenses or write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA.
 * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite
 * 305, Redwood City, CA 94063, USA, or at email address info@funambol.com.
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * "Powered by Funambol" logo. If the display of the logo is not reasonably
 * feasible for technical reasons, the Appropriate Legal Notices must display
 * the words "Powered by Funambol".
//package com.funambol.util;

import java.io.UnsupportedEncodingException;

 * A class containing static methods to perform decoding from <b>quoted
 * printable</b> content transfer encoding and to encode into
public class QuotedPrintable {

  private static byte HT = 0x09; // \t
  private static byte LF = 0x0A; // \n
  private static byte CR = 0x0D; // \r

   * A method to decode quoted printable encoded data. It overrides the same
   * input byte array to save memory. Can be done because the result is surely
   * smaller than the input.
   * @param qp
   *            a byte array to decode.
   * @return the length of the decoded array.
  public static int decode(final byte[] qp) {
    final int qplen = qp.length;
    int retlen = 0;

    for (int i = 0; i < qplen; i++) {
      // Handle encoded chars
      if (qp[i] == '=')
        if (qplen - i > 2)
          // The sequence can be complete, check it
          if (qp[i + 1] == QuotedPrintable.CR
              && qp[i + 2] == QuotedPrintable.LF) {
            // soft line break, ignore it
            i += 2;

          } else if (QuotedPrintable.isHexDigit(qp[i + 1])
              && QuotedPrintable.isHexDigit(qp[i + 2])) {
            // convert the number into an integer, taking
            // the ascii digits stored in the array.
            qp[retlen++] = (byte) (QuotedPrintable
                .getHexValue(qp[i + 1]) * 16 + QuotedPrintable
                .getHexValue(qp[i + 2]));

            i += 2;

          } else
          //  Log.error("decode: Invalid sequence = " + qp[i + 1]
            //    + qp[i + 2]);

      // RFC 2045 says to exclude control characters mistakenly
      // present (unencoded) in the encoded stream.
      // As an exception, we keep unencoded tabs (0x09)
      if ((qp[i] >= 0x20 && qp[i] <= 0x7f) || qp[i] == QuotedPrintable.HT
          || qp[i] == QuotedPrintable.CR
          || qp[i] == QuotedPrintable.LF)
        qp[retlen++] = qp[i];

    return retlen;

  private static boolean isHexDigit(final byte b) {
    return ((b >= 0x30 && b <= 0x39) || (b >= 0x41 && b <= 0x46));

  private static byte getHexValue(final byte b) {
    return (byte) Character.digit((char) b, 16);

   * @param qp
   *            Byte array to decode
   * @param enc
   *            The character encoding of the decoded string
   * @return The decoded string.
  public static String decode(final byte[] qp, final String enc) {
    final int len = QuotedPrintable.decode(qp);
    try {
      return new String(qp, 0, len, enc);
    } catch (final UnsupportedEncodingException e) {
    //  Log.error("qp.decode: " + enc + " not supported. " + e.toString());
      return new String(qp, 0, len);

   * A method to encode data in quoted printable
   * @param content
   *            The string to be encoded
   * @return the encoded string.
   * @throws Exception
   *             public static byte[] encode(String content, String enc)
   *             throws Exception { // TODO: to be implemented (has to return
   *             a String) throw new
   *             Exception("This method is not implemented!"); }
   * A method to encode data in quoted printable
   * @param content
   *            The string to be encoded
   * @return the encoded string.
   * @throws Exception
   *             public static byte[] encode(byte[] content) throws Exception
   *             { // TODO: to be implemented (has to return a String) throw
   *             new Exception("This method is not implemented!"); }



Related examples in the same category

1.Split with
2.Split first with
3.split By Space and save result to a List
4.Space trim
5.truncate by length
6.Remove all blanks
7.Is a string a Number
8.Random string
9.Tokenizer. Why? Because StringTokenizer is not available in J2ME.
10.String resource
11.Shows creating text with links from HTML in the Java code, rather than from a string resource. Note that for a
12.Join a collection of strings by a seperator
13.Tests if a string is blank: null, emtpy, or only whitespace (" ", \r\n, \t, etc)
14.Tests if a string is numeric, i.e. contains only digit characters
15.Writer implementation that outputs to a StringBuilder
16.Gets the device's phone number as a String.
17.Inspects a link Configuration through reflection API to generate a human readable String with values replaced with their constants names.
18.Returns a String representation of the content of a android.view.Display object.
19.Get String Element Value
20.Join strings
21.Find two consecutive newlines in a string.
22.Retrieve a boolean primitive type from a String.
23.Trim char from string
24.Returns true if the string does not fit in standard ASCII
25.Returns true if the given string is null or empty.
26.4 octets in address string
27.Add space to CSV string
28.String fast Split
29.Split a String by a Character, i.e. Split lines by using '\n'
30.String Capitalizer
31.Count char in a string
32.Search char in a string from a starting position
33.load String From Raw Resource
34.Join Collection of String
35.Padding a string, truncate a string
36.Converts a string to title casing.
37.reversing String
38.load Resource To String
39.convert Duration to String
40.Convert string from one encoding to another
41.Object to String and String to Object
42.IP to String
43.Convert string to bumber and convert number to string
44.line string reader in J2ME
45.String to Map with token
46.Generate the client id, which is a fixed string of length 8 concatenated with 12 random bytes
47.StringBuilder Writer
48.Return a specific raw resource contents as a String value.
49.Returns the ISO 8601-format String corresponding to the given duration (measured in milliseconds).
50.Returns a string representation of the given number of nanoseconds.
51.Simple Tokenizer
52.split By Space
53.Pad Front
54.Count Occurrences
55.Padding Left
56.captalize Words
57.Tokenizer Utils
58.Returns space padding
59.Normalise Whitespace
60.Removes unwanted blank characters
61.Removes unwanted backslashes characters
62.equals Ignore Case
63.Title Name Parser
64.Split Camal Case
65.Split and combine by token
66.Shorten text for display in lists etc.