Существует ли быстрая функция для кодирования / декодирования строк в Android с использованием полной процентной кодировки? - PullRequest
1 голос
/ 24 апреля 2011

Я хочу использовать кодирование / декодирование значения процента для некоторых строковых операций в моем приложении Android. Я не хочу использовать пару функций кодирования / декодирования URI, потому что я хочу кодировать каждый символ, а не только те, которые кодируются при кодировании URI для выполнения веб-запросов. Есть ли какие-либо встроенные функции в библиотеках Android или Java, которые могут это делать?

- Рошлер

Ответы [ 2 ]

2 голосов
/ 24 апреля 2011

В API нет ничего встроенного, чтобы сделать это напрямую, но это довольно просто.Для преобразования символов в байты лучше использовать определенную кодировку символов (например, UTF-8).Это должно помочь при кодировании:

static final String digits = "0123456789ABCDEF";

static void convert(String s, StringBuffer buf, String enc)
        throws UnsupportedEncodingException {
    byte[] bytes = s.getBytes(enc);
    for (int j = 0; j < bytes.length; j++) {
        buf.append('%');
        buf.append(digits.charAt((bytes[j] & 0xf0) >> 4));
        buf.append(digits.charAt(bytes[j] & 0xf));
    }
}

О, да, вы также просили расшифровать:

static String decode(String s, String enc)
        throws UnsupportedEncodingException {
    StringBuffer result = new StringBuffer(s.length());
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    for (int i = 0; i < s.length();) {
        char c = s.charAt(i);
        if (c == '%') {
            out.reset();
            do {
                if (i + 2 >= s.length()) {
                    throw new IllegalArgumentException(
                        "Incomplete trailing escape (%) pattern at " + i);
                }
                int d1 = Character.digit(s.charAt(i + 1), 16);
                int d2 = Character.digit(s.charAt(i + 2), 16);
                if (d1 == -1 || d2 == -1) {
                    throw new IllegalArgumentException(
                        "Illegal characters in escape (%) pattern at " + i
                        + ": " + s.substring(i, i+3));
                }
                out.write((byte) ((d1 << 4) + d2));
                i += 3;
            } while (i < s.length() && s.charAt(i) == '%');
            result.append(out.toString(enc));
            continue;
        } else {
            result.append(c);
        }
        i++;
    }
}
1 голос
/ 24 апреля 2011

Это довольно тривиально и не требует библиотечных функций:

public static String escapeString(String input) {
    String output = "";

    for (byte b : input.getBytes()) output += String.format("%%%02x", b);
    return output;
}

public static String unescapeString(String input) {
    String output = "";

    for (String hex: input.split("%")) if (!"".equals(hex)) output += (char)Integer.parseInt(hex, 16);
    return output;
}

public static String unescapeMultiByteString(String input, String charset) {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    String result = null;

    for (String hex: input.split("%")) if (!"".equals(hex)) output.write(Integer.parseInt(hex, 16));
    try { result = new String(output.toByteArray(), charset); }
    catch (Exception e) {}
    return result;
}
...