2011-12-01 6 views
14

Estoy tratando de integrarme con ybp.com, un proveedor de software patentado para administrar flujos de trabajo de pedidos de libros en grandes bibliotecas. Me sigue dando URL que contienen caracteres codificados con un "25" extra en ellos. Al igual que este título del libro:¿Qué caracteres codificados hexagonales producidos estándar con un "25" extra en la parte delantera?

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

Los caracteres codificados en esta muestra son los siguientes:

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

Necesito convertir estas codificaciones a un formato de mis aplicaciones internas pueden reconocer, y la especial de 25 es tirar cosas fuera de control. Los últimos dos dígitos de los caracteres codificados hexadecimales parecen ser idénticos a las codificaciones URL estándar, por lo que un método de fuerza bruta sería reemplazar "% 25" con "%". Pero estoy asustado de hacer eso porque seguramente me atormentaría más tarde cuando aparezca real% 25 por alguna razón.

Entonces, ¿qué estándar es esto? ¿Hay un algoritmo oficial para convertir valores como este a otras codificaciones?

+0

Parece que tiene una doble codificación. % 25 =%, así que decodifique una vez% 253A se convierte en% 3A y luego decodifique de nuevo a ':' Cómo lo hace es específico del idioma. –

Respuesta

17

% 25 es en realidad un carácter%. Supongo que el sitio web externo está URLEncoding su salida dos veces accidentalmente.

Si ese es el caso, es seguro para reemplazar% 25 con% (o simplemente URLDecode dos veces)

+0

Útil para mencionar "doble codificación" es el término de búsqueda para obtener más información – austinmarton

3

El código ASCII 37 (25 en hexadecimal) es %, por lo que la codificación URL de % es %25.

Parece que los datos codificados consiguieron URL dos veces: , -> %2C -> %252C

Sustituyendo cada %25 para % no debe generar ningún problema, como una real %25 obtendría codificado a %25252525.

0

Cree un contador que incremente uno por uno para los siguientes dos caracteres, y si encontró el módulo, retrocede, asigne el contador anterior al carácter '%' char y proceda de nuevo. Algo como esto.

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; 
    ...... 
Cuestiones relacionadas