2011-12-01 7 views
14

Büyük kitaplıklarda kitap siparişi iş akışlarını yönetmek için özel bir yazılım satıcısı olan ybp.com ile entegre olmaya çalışıyorum. Bana fazladan "25" ile kodlanmış karakterleri içeren URL'leri beslemeye devam ediyor. Bu kitap başlığı gibi:Hangi standart, ön tarafta ekstra "25" olan altıgen kodlu karakterler üretti?

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

benim iç uygulamalar tanıyabileceği bir biçime bu kodlamaları dönüştüren gerekiyor ve ekstra 25 atıyor:

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

bu örnekteki kodlanmış karakterler aşağıdaki gibidir Kilter kapalı şeyler. Altıgen kodlanmış karakterlerin son iki hanesi standart URL kodlamaları ile aynı görünüme sahiptir, bu nedenle "% 25" ile "%" ifadesinin değiştirilmesi için kaba bir kuvvet metodu olacaktır. Ama bunu yapmaktan hoşlanıyorum çünkü bir nedenle bir gerçek% 25 bir nedenden dolayı ortaya çıktığında beni takip etmekten de emin olabilirsiniz.

Peki, bu hangi standarttır? Bunun gibi değerleri diğer kodlamalara dönüştürmek için resmi bir algoritma var mı?

+0

Çift kodlanmış gibi görünüyor. % 25 =%, bir kez% 253A kodunu çözer, sonra% 3A olur ve sonra tekrar ':' Bunu nasıl çözersiniz? –

cevap

17

% 25 aslında bir% karakterdir. Tahminimce dış web sitesi çıktılarını iki kez yanlışlıkla kodlamak.

Eğer durum buysa, o% (ya da sadece urldecode iki kez)

+0

Daha fazla bilgi için arama terimi "çift kodlama" dır. – austinmarton

3

ASCII kodu 37 (onaltılık 25) % olduğu ile% 25 yerine güvenli, dolayısıyla % URL kodlaması %25 olduğunu. , -> %2C -> %252C

herhangi bir sorun oluşturmaz gerektiğini her %25% Oyuncu değişikliği gerçek %25%25252525 için kodlanmış alacağı gibi: Verilerinizi URL iki kez kodlanmış ki gibi

görünüyor.

0

Sonraki iki karakter için birer birer artan bir sayaç oluşturun ve modül bulduysanız, geri dönersiniz, önceki sayacı '%' karakterine atayın ve yeniden devam edin. Böyle bir şey.

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