2011-12-01 8 views
14

Sto cercando di integrare con ybp.com, un fornitore di software proprietario per la gestione dei flussi di lavoro per l'ordinazione di libri in librerie di grandi dimensioni. Continua a darmi URL che contengono caratteri codificati con un "25" in più. Come questo titolo del libro:Quale standard ha prodotto caratteri con codifica esadecimale con un "25" in più nella parte anteriore?

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

I caratteri codificati in questo campione sono i seguenti:

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

ho bisogno di convertire queste codifiche in un formato le mie applicazioni interne in grado di riconoscere, e l'extra 25 sta gettando le cose si perdono. Le ultime due cifre dei caratteri codificati esadecimali sembrano essere identiche alle codifiche URL standard, quindi un metodo forza bruta sarebbe sostituire "% 25" con "%". Ma sono molto interessato a farlo perché sicuramente mi tormenterà più tardi quando un effettivo% 25 verrà visualizzato per qualche motivo.

Quindi, quale standard è questo? Esiste un algoritmo ufficiale per convertire valori come questo in altre codifiche?

+0

Sembra la sua doppia codifica. % 25 =%, quindi decodificare una volta% 253A diventa% 3A, quindi decodificare nuovamente in ":" Il modo in cui si esegue questa operazione è specifico per la lingua. –

risposta

17

% 25 è in realtà un carattere%. La mia ipotesi è che il sito esterno sia URLEncoding la loro uscita due volte accidentalmente.

Se questo è il caso, è sicuro sostituire% 25 con% (o solo urldecode due volte)

+0

Utile menzionare "doppia codifica" è il termine di ricerca per maggiori informazioni – austinmarton

3

Il codice ASCII 37 (25 in esadecimale) è %, quindi la codifica URL % è %25.

Sembra che i dati ricevuti URL codificati due volte: , -> %2C -> %252C

Sostituendo ogni %25 per % non dovrebbe generare alcun problema, come un vero e proprio %25 otterrebbe codificato %25252525.

0

Creare un contatore che incrementi uno per uno per i due caratteri successivi, e se si trova modulo, si torna indietro, assegnare il contatore precedente il carattere "%" e procedere di nuovo. Qualcosa come questo.

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; 
    ...... 
Problemi correlati