Vai al contenuto principale

Parametri di percent-encoding

Alcune parti della X API, in particolare quelle che gestiscono le firme OAuth, richiedono che le stringhe siano codificate in conformità a RFC 3986, sezione 2.1. Poiché molte implementazioni degli algoritmi di codifica degli URL non sono pienamente compatibili con RFC 3986, codifiche non corrette causano numerosi errori nelle firme OAuth. Per questo motivo, in questa pagina è illustrato l’esatto algoritmo di firma da utilizzare. Questa pagina descrive il processo di codifica degli URL definito in RFC 3986, sezione 2.1. Ti invitiamo a fare riferimento a tale specifica in caso di ambiguità o conflitto con questo documento.  

Codifica di una stringa

Il seguente algoritmo presuppone la codifica di una stringa SRC copiandone i valori, byte per byte, in una stringa DST. Passo 1: Finché SRC contiene byte non letti, leggere il byte successivo (8 bit) da SRC. In genere questo è considerato un carattere, ma nel caso di codifiche in cui un carattere può occupare più di un byte (come UTF-8), leggere solo il primo byte. Passo 2: Verificare se il byte letto corrisponde a uno dei seguenti equivalenti ASCII. La tabella seguente è stata suddivisa in righe per leggibilità, ma è necessario solo determinare se il byte letto è presente nella tabella, non la riga specifica.
NomeCaratteri ASCIIValori byte equivalenti
Cifre‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39
Lettere maiuscole‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’0x41, 0x42, 0x43, 0x44, 0x45,0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B,0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,0x52, 0x53, 0x54, 0x55, 0x56, 0x57,0x58, 0x59, 0x5A
Lettere minuscole‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’0x61, 0x62, 0x63, 0x64, 0x65,0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B,0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,0x72, 0x73, 0x74, 0x75, 0x76, 0x77,0x78, 0x79, 0x7A
Caratteri riservati‘-‘, ‘.’, ‘_’, ‘~’0x2D, 0x2E, 0x5F, 0x7E
Passo 2b: Se il byte non è presente nella tabella sopra, continuare. Qualsiasi altro valore deve essere codificato. Passo 2a: Se il byte è presente nella tabella sopra, copiarlo in DST e tornare al Passo 1. I caratteri elencati nella tabella sopra non richiedono escape, quindi si copia direttamente il byte. Passo 3: Scrivere il carattere ‘%’ in DST. Il carattere percentuale ‘%’ (0x25 in esadecimale, 00100101 in binario) indica che i due caratteri successivi rappresenteranno un byte codificato. Passo 4: Scrivere in DST due caratteri che rappresentino il valore esadecimale, in ASCII maiuscolo, del byte corrente. Questo può risultare poco intuitivo, ecco un esempio. Supponiamo che il byte corrente sia 0xE6 (11100110 in binario). Questo corrisponde al valore UTF-8 del carattere ‘æ’. Per codificare questo valore, scrivere il carattere ‘E’ (0x45, dalla tabella sopra) e poi il carattere ‘6’ (0x36) in DST. Gli ultimi tre caratteri scritti devono essere “%E6”. Nota: se si scrive una lettera come A, B, C, D, E o F, è necessario usare il carattere maiuscolo. Passo 5: Tornare al Passo 1. Continuare finché l’intero contenuto di SRC non è stato copiato in DST.  

Esempi

I seguenti esempi possono essere utili per confrontare l’output del tuo codice. Dovresti considerare qualsiasi differenza come un errore. Gli spazi codificati come caratteri “+” sono un esempio di codifica errata.
Stringa originaleStringa codificata
Ladies + GentlemenLadies%20%2B%20Gentlemen
An encoded string!An%20encoded%20string%21
Dogs, Cats & MiceDogs%2C%20Cats%20%26%20Mice
%E2%98%83
I