Respuesta corta: iso-8859-1 a menos que se utilicen palabras codificadas de acuerdo con RFC2047 (MIME).
Explicación más larga:
RFC2617, sección 2 (Autenticación HTTP) define las credenciales básicas :
basic-credentials = base64-user-pass
base64-user-pass = <base64 encoding of user-pass,
except not limited to 76 char/line>
user-pass = userid ":" password
userid = *<TEXT excluding ":">
password = *TEXT
La especificación no debe leerse sin consultar RFC2616 (HTTP 1.1) para obtener definiciones en BNF (como la anterior):
Esta especificación es un complemento de la especificación HTTP / 1.1 2 . Utiliza la sección 2.1 de BNF aumentada de ese documento y se basa tanto en los no terminales definidos en ese documento como en otros aspectos de la especificación HTTP / 1.1.
RFC2616, sección 2.1 define TEXTO (énfasis mío):
La regla TEXT solo se utiliza para valores y contenidos de campos descriptivos que no están destinados a ser interpretados por el analizador de mensajes. Las palabras * TEXT PUEDEN contener caracteres de conjuntos de caracteres distintos de
ISO-8859-1 solo cuando se codifican de acuerdo con las reglas de RFC 2047.
TEXT = <any OCTET except CTLs, but including LWS>
Entonces, definitivamente es iso-8859-1 a menos que detecte alguna otra codificación de acuerdo con las reglas RFC2047 (MIME pt. 3):
// Username: Mike
// Password T€ST
Mike:=?iso-8859-15?q?T€ST?=
En este caso, el signo del euro en la palabra se codificaría 0xA4
según iso-8859-15 . Tengo entendido que debe verificar estos delimitadores de palabras codificadas y luego decodificar las palabras internas según la codificación especificada. Si no lo hace, pensará que la contraseña es =?iso-8859-15?q?T¤ST?=
(observe que 0xA4
se decodificará ¤
cuando se interprete como iso-8859-1).
Este es mi entendimiento, no puedo encontrar una confirmación más explícita que estas RFC. Y algo de eso parece contradictorio. Por ejemplo, uno de los 4 objetivos declarados de RFC2047 (MIME, punto 3) es redefinir:
el formato de los mensajes para permitir ... información de encabezado textual en juegos de caracteres que no sean US-ASCII.
Pero luego RFC2616 (HTTP 1.1) define un encabezado usando la regla TEXT que por defecto es iso-8859-1. ¿Significa eso que cada palabra en este encabezado debe ser una palabra codificada (es decir, la =?...?=
forma)?
También es relevante, ningún navegador actual hace esto. Usan utf-8 (Chrome, Opera), iso-8859-1 (Safari), la página de códigos del sistema (IE) o algo más (como solo el bit más significativo de utf-8 en el caso de Firefox).
Editar: Me acabo de dar cuenta de que esta respuesta analiza el problema más desde la perspectiva del lado del servidor.