Saltar al contenido principal

Parámetros de codificación con porcentaje

Partes de la X API, en particular las relacionadas con las firmas OAuth, requieren que las cadenas se codifiquen conforme a RFC 3986, sección 2.1. Dado que muchas implementaciones de algoritmos de codificación de URL no son totalmente compatibles con la RFC 3986, las codificaciones incorrectas provocan numerosos errores en las firmas de OAuth. Por ello, en esta página se detalla el algoritmo de firmado exacto que debe utilizarse. Esta página describe el proceso de codificación de URL definido en la RFC 3986, sección 2.1. Le recomendamos consultar esa especificación en caso de ambigüedad o conflicto con este documento.  

Codificación de una cadena

El siguiente algoritmo asume que estás codificando una cadena SRC copiando sus valores byte por byte a una cadena DST. Paso 1: Mientras SRC contenga bytes no leídos, lee el siguiente byte (8 bits) de SRC. Normalmente se considera un carácter, pero en codificaciones donde un carácter puede ocupar más de un byte (como UTF-8), lee solo el primer byte. Paso 2: Comprueba si el byte leído coincide con alguno de los siguientes equivalentes ASCII. La siguiente tabla se ha dividido en filas para facilitar la lectura, pero solo necesitas determinar si el byte leído aparece en la tabla, no en qué fila específica.
NombreCaracteres ASCIIValores de byte equivalentes
Dígitos‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39
Letras mayúsculas‘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
Letras minúsculas‘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
Caracteres reservados‘-‘, ‘.’, ‘_’, ‘~’0x2D, 0x2E, 0x5F, 0x7E
Paso 2b: Si el byte no figura en la tabla anterior, continúa. Cualquier otro valor debe codificarse. Paso 2a: Si el byte figura en la tabla anterior, cópialo en DST y vuelve al Paso 1. Los caracteres de la tabla anterior no necesitan escape, así que simplemente copia el byte directamente. Paso 3: Escribe el carácter ‘%’ en DST. El carácter de porcentaje ‘%’ (0x25 en hexadecimal y 00100101 en binario) indica que los dos siguientes bytes representarán un byte codificado. Paso 4: Escribe en DST dos caracteres que representen el valor hexadecimal en mayúsculas, codificado en ASCII, del byte actual. Puede resultar confuso, así que aquí tienes un ejemplo. Supón que el byte actual es 0xE6 (11100110 en binario). Esto corresponde al valor codificado en UTF-8 de ‘æ’. Para codificar este valor, escribe el carácter ‘E’ (0x45, de la tabla anterior) y luego el carácter ‘6’ (0x36) en DST. Los últimos tres caracteres escritos deberían haber sido “%E6”. Ten en cuenta que, si escribes una letra como A, B, C, D, E o F, debes usar la mayúscula. Paso 5: Vuelve al Paso 1. Continúa hasta que la totalidad de SRC se copie en DST.  

Ejemplos

Los siguientes ejemplos pueden ser útiles para comparar con la salida de tu propio código. Debes considerar cualquier diferencia como un error. Los espacios codificados como caracteres “+” son un ejemplo de codificación incorrecta.
Cadena originalCadena codificada
Ladies + GentlemenLadies%20%2B%20Gentlemen
An encoded string!An%20encoded%20string%21
Dogs, Cats & MiceDogs%2C%20Cats%20%26%20Mice
%E2%98%83