Подтвердить что ты не робот

Какие стандартные выпущенные символы с шестнадцатеричным кодированием с дополнительным "25" спереди?

Я пытаюсь интегрироваться с ybp.com, поставщиком проприетарного программного обеспечения для управления рабочими процессами упорядочения заказов в больших библиотеках. Он продолжает кормить меня URL-адресами, которые содержат символы, закодированные с дополнительным "25" в них. Как и название этой книги:

VOLATILE KNOWING%253a PARENTS%252c TEACHERS%252c AND THE CENSORED STORY OF ACCOUNTABILITY IN AMERICA%2527S PUBLIC SCHOOLS.

Закодированные символы в этом примере выглядят следующим образом:

%253a = %3A = a colon
%252c = %2C = a comma
%2527 = %27 = an apostrophe (non-curly)

Мне нужно преобразовать эти кодировки в формат, который могут распознать мои внутренние приложения, а дополнительные 25 - отбрасывают вещи. Окончательные две цифры шестнадцатеричных кодированных символов выглядят идентичными стандартным кодировкам URL, поэтому метод грубой силы должен заменить "% 25" на "%". Но я стараюсь это делать, потому что он обязательно будет преследовать меня позже, когда по какой-то причине появляется фактический% 25.

Итак, что это за стандарт? Есть ли официальный алгоритм для преобразования таких значений в другие кодировки?

4b9b3361

Ответ 1

% 25 - фактически символ%. Я предполагаю, что внешний веб-сайт URLEncoding их выход дважды случайно.

Если это случай, можно заменить% 25% (или просто URLDecode дважды)

Ответ 2

Код ASCII 37 (25 в шестнадцатеричном формате) равен %, поэтому кодировка URL % равна %25.

Похоже, что ваши данные получили URL-адрес дважды: , -> %2C -> %252C

Подстановка каждого %25 для % не должна создавать никаких проблем, так как фактический %25 будет закодирован до %25252525.

Ответ 3

Создайте счетчик, который увеличивается один за другим для следующих двух символов, и если вы нашли модуль, вернитесь назад, назначьте предыдущий счетчик "%" char и повторите попытку. Что-то вроде этого.

char *str, *newstr; // Fill up with some memory before proceeding below..
....
int k = 0, j = 0;
short modulus = 0;
char first = 0, second = 0;
short proceed = 0;

for(k=0,j=0; k<some_size; j++,k++) {
    if(str[k] == '%') {
        ++k; first = str[k];
        ++k; second = str[k];
        proceed = 1;
    } else if(modulus == 1) {
        modulus = 0;
        --j; first = str[k];
        ++k; second = str[k];
        newstr[j] = '%';
        proceed = 1;
    } else proceed = 0; // Do not do decoding..

    if(proceed == 1) {
        if(first == '2' && second == '5') {
            newstr[j] = '%';
            modulus = 1;
    ......