Punycode e internacionalización de dominios
Punycode, definido en RFC 3492, representa puntos Unicode con letras, dígitos y guiones. El prefijo xn-- identifica una etiqueta de dominio internacionalizada compatible con ASCII.
El algoritmo trabaja por etiqueta. El modo de dominio normaliza tres variantes comunes del punto, conserva un punto raíz final opcional y procesa cada parte por separado.
Punycode no es todo IDNA. Esta implementación sin dependencias añade un perfil conservador de letras, marcas, números y guiones, límites DNS y salida minúscula, pero no pretende reproducir todas las reglas IDNA2008 o UTS #46.
Cómo convertir un dominio internacional
- Selecciona dominio completo o etiqueta individual.
- Codifica Unicode o decodifica etiquetas xn--.
- Introduce solo el host, sin esquema, puerto, ruta o consulta.
- Corrige etiquetas vacías, guiones, caracteres o longitudes inválidas.
- Para producción usa una biblioteca IDNA mantenida y las reglas del registro.
Ejemplos de etiquetas y dominios Punycode
Los vectores muestran el prefijo xn--, el tratamiento por etiqueta, las minúsculas y variantes Unicode del punto.
| Entrada | Salida | Dirección de conversión | Notas |
|---|---|---|---|
bücher |
xn--bcher-kva |
Codificar | Etiqueta alemana. Las letras ASCII permanecen legibles y ü se codifica en el sufijo. |
mañana |
xn--maana-pta |
Codificar | Etiqueta española. maana-pta es la carga RFC 3492; xn-- forma la A-label. |
例子 |
xn--fsqu00a |
Codificar | Etiqueta china. Sin caracteres ASCII básicos, toda la carga queda codificada. |
Münich.Example |
xn--mnich-kva.example |
Codificar | Dominio completo. Cada etiqueta se procesa por separado y se normaliza a minúsculas. |
例子。测试 |
xn--fsqu00a.xn--0zwm56d |
Codificar | Punto Unicode. El punto ideográfico se normaliza antes de dividir etiquetas. |
XN--BCHER-KVA.example |
bücher.example |
Decodificar | Decodificar A-label. La comparación DNS no distingue entre mayúsculas y minúsculas. |
Reglas de etiquetas y puntos
Las etiquetas ASCII se convierten a minúsculas, solo admiten letras, dígitos y guiones y no pueden empezar o terminar con guion.
El perfil Unicode admite letras, marcas, números y guiones internos. Rechaza espacios, guiones bajos, barras, símbolos y emoji.
- Se aceptan cuatro formas de punto contando ASCII.
- a..b contiene una etiqueta vacía.
- Una URL completa no es una etiqueta.
- Cada A-label tiene máximo 63 caracteres.
- El dominio codificado tiene máximo 253 caracteres.
Resumen del algoritmo Bootstring
Primero copia caracteres ASCII básicos y separa el sufijo codificado con un guion.
Un delta y un bias adaptativo producen enteros variables en base 36; el decodificador restaura cada punto en su posición.
Se controlan desbordamientos, rango Unicode y forma canónica mediante recodificación. No se realiza ninguna consulta DNS.
Usos de Punycode
Es una capa de interoperabilidad e inspección entre nombres Unicode y sistemas DNS ASCII.
| Elemento | Descripción |
|---|---|
| Registros y certificados | Lee etiquetas xn-- en diagnósticos. |
| Preparar etiquetas IDN | Observa la forma ASCII antes de aplicar políticas completas. |
| Dominios de correo | Analiza la parte de dominio por separado. |
| Investigar discrepancias | Compara la forma visual y exacta. |
| Probar implementaciones | bücher, mañana y 例子 son vectores útiles. |
Errores y riesgos IDN
Una conversión válida no garantiza seguridad: existen caracteres confusos y mezclas de escrituras.
Navegadores pueden aplicar UTS #46 antes de Punycode; este perfil más estrecho está documentado explícitamente.
- El guion bajo no se acepta como host.
- Emoji se rechaza.
- xn-- vacío es inválido.
- Las A-label no canónicas se rechazan.
- No se comprueba existencia ni propiedad.
Punycode, IDNA y codificación URL
Punycode es el algoritmo; IDNA decide validez y mapeo; UTS #46 aporta compatibilidad usada por muchas aplicaciones.
La codificación porcentual actúa sobre componentes URL y no sustituye el paso IDNA del host.
| Elemento | Descripción |
|---|---|
| IDNA2008 | Marco de validez más amplio. |
| UTS #46 | Mapeo de compatibilidad no implementado por completo. |
| Codificación URL | Escapa bytes de ruta o consulta. |