По какому стандарту получаются шестнадцатеричные символы с дополнительными «25» на передней панели? - PullRequest
18 голосов
/ 02 декабря 2011

Я пытаюсь интегрироваться с 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.

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

Ответы [ 3 ]

21 голосов
/ 02 декабря 2011

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

Если это так, то можно безопасно заменить% 25 на% (или просто дважды URL-адрес)

3 голосов
/ 02 декабря 2011

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

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

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

0 голосов
/ 22 января 2014

Создайте счетчик, который увеличивается один за другим для следующих двух символов, и если вы нашли модуль, вы возвращаетесь, назначаете предыдущему счетчику символ «%» и продолжаете снова. Как то так.

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;
    ......
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...