Кодировка текста, которая производит удобочитаемые кодировки, подходящие в качестве идентификаторов Javascript? - PullRequest
0 голосов
/ 10 сентября 2018

Я работаю над инструментом, который читает произвольные файлы данных и создает таблицу из своих данных, которую я затем сохраняю в базе данных.Я хотел бы сохранить заголовки столбцов.Заголовки столбцов уже являются текстом ASCII (или, возможно, латинским1), но в них есть символы, которые не являются допустимыми именами переменных (например, пробелы,%), поэтому мне нужно как-то их кодировать.Я ищу кодировку для заголовков столбцов, которая имеет следующие свойства:

  1. Разборчивый : было бы неплохо, если бы закодированный текст выглядел максимально похожим на незакодированный текст(т. е. для отладки).
  2. Юридический идентификатор : хотелось бы, чтобы закодированный текст был допустимым идентификатором JavaScript ( ECMA-262, раздел 7.6 ).
  3. Обратимый : Я хотел бы иметь возможность получить точный исходный текст из закодированного текста.

Я могу придумать подходы, которые работают для 2из 3 случаев, но я не знаю, как получить все 3. Например, url encoding не производит имена допустимых идентификаторов, я думаю, я мог бы преобразовать base64, чтобы они были легальными, но это не разборчиво, чтоУ меня в данный момент есть только некоторые замены, так что это не обратимо.

Эффективность не имеет значения, поэтому при необходимости я мог бы хранить закодированные и некодированные тексты вместе.Лучший вариант, который я могу придумать, - это использовать url encoding, а затем поменять проценты на $.Я думал, что будут лучшие варианты, чем этот, но я не могу ничего найти.Есть что-нибудь лучше?

1 Ответ

0 голосов
/ 14 сентября 2018

Эта пара методов, основанных на PercentEscaper Гуавы, кажется, отвечает моим требованиям. Guava не предоставляет не простую , но, учитывая мои простые потребности, я могу просто использовать простой URLDecoder.

private static PercentEscaper escaper = new PercentEscaper('',false)

static String getIdentifier(String str) {
    //minimal safe characters, but leaves letters alone, so it's somewhat legible
    String escaped = escaper.escape(str);

    //javascript identifiers can't start with a digit, and the escaper doesn't know the first
    //character has different rules. so prepend a "%3" to encode the digit
    if(Character.isDigit(escaped.charAt(0))){
        escaped = "%3"+escaped
    }

    //a percent isn't a valid in a javascript identifier, so we'll use _ as our special character
    escaped = escaped.replace('%','_');

    return escaped;
}

static String invertIdentifier(String str){
    String unescaped = str.replace('_','%');
    unescaped = URLDecoder.decode(unescaped, "UTF-8");
    return unescaped;
}
...