Ответ 1
% 25 - фактически символ%. Я предполагаю, что внешний веб-сайт URLEncoding их выход дважды случайно.
Если это случай, можно заменить% 25% (или просто URLDecode дважды)
Я пытаюсь интегрироваться с 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.
Итак, что это за стандарт? Есть ли официальный алгоритм для преобразования таких значений в другие кодировки?
% 25 - фактически символ%. Я предполагаю, что внешний веб-сайт URLEncoding их выход дважды случайно.
Если это случай, можно заменить% 25% (или просто URLDecode дважды)
Код ASCII 37 (25 в шестнадцатеричном формате) равен %
, поэтому кодировка URL %
равна %25
.
Похоже, что ваши данные получили URL-адрес дважды: , -> %2C -> %252C
Подстановка каждого %25
для %
не должна создавать никаких проблем, так как фактический %25
будет закодирован до %25252525
.
Создайте счетчик, который увеличивается один за другим для следующих двух символов, и если вы нашли модуль, вернитесь назад, назначьте предыдущий счетчик "%" 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;
......