Skip to main content

Codificación por porcentaje de parámetros

Partes de la X API, en particular las que tratan con firmas OAuth, requieren que las cadenas estén codificadas de acuerdo con la RFC 3986, Sección 2.1. Dado que muchas implementaciones de algoritmos de codificación de URL no son totalmente compatibles con RFC 3986, las codificaciones incorrectas son la causa de muchos errores de firma OAuth. Por esta razón, el algoritmo exacto de firma a usar se cubre en esta página. Esta página cubre el proceso de codificación de URL descrito en RFC 3986, Sección 2.1. Te animamos a consultar esa especificación en caso de cualquier 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 a byte a una cadena DST. Paso 1: Mientras SRC contenga bytes no leídos, lee el siguiente byte (8 bits) de SRC. Normalmente, esto se considera un carácter, pero en el caso de codificaciones donde un carácter puede ser más de un byte (como UTF-8), simplemente lee 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 mayor legibilidad, pero solo necesitas determinar si el byte leído existe en la tabla en absoluto, no la 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 aparece en la tabla anterior, continúa. Cualquier otro valor debe codificarse. Paso 2a: Si el byte aparece en la tabla anterior, cópialo a DST y vuelve al Paso 1. Los caracteres listados en la tabla anterior no necesitan ser escapados, por lo que simplemente copiarás el byte directamente. Paso 3: Escribe el carácter ’%’ a DST. El carácter de porcentaje ’%’ (o 0x25 en hexadecimal y 00100101 en binario) indica que los siguientes dos bytes representarán un byte codificado. Paso 4: Escribe dos caracteres que representen el valor hexadecimal codificado en ASCII en mayúsculas del byte actual a DST. Esto es un poco confuso, así que aquí hay un ejemplo. Imagina que el byte actual es 0xE6 (11100110 en binario). Esto corresponde con el 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) a 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 el carácter en mayúsculas. Paso 5: Vuelve al Paso 1. Continúa hasta que toda la totalidad de SRC se copie a 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