Punycode es una representación de Unicode con el subconjunto de caracteres ASCII limitado que se utiliza para los nombres de host de Internet . Con Punycode, los nombres de host que contienen caracteres Unicode se transcodifican en un subconjunto de ASCII que consta de letras, dígitos y guiones, que se denomina subconjunto de letras, dígitos y guiones (LDH). Por ejemplo, München ( nombre alemán de Munich ) está codificado como Mnchen-3ya .
Si bien el sistema de nombres de dominio (DNS) admite técnicamente secuencias arbitrarias de octetos en las etiquetas de nombres de dominio, los estándares DNS recomiendan el uso del subconjunto LDH de ASCII que se usa convencionalmente para los nombres de host, y requieren que las comparaciones de cadenas entre los nombres de dominio DNS se realicen entre mayúsculas y minúsculas. insensible. La sintaxis de Punycode es un método de codificación de cadenas que contienen caracteres Unicode, como nombres de dominio internacionalizados (IDNA), en el subconjunto LDH de ASCII favorecido por DNS. Se especifica en la Solicitud de comentarios de IETF 3492. [1]
Procedimiento de codificación
Como se indica en RFC 3492, "Punycode es una instancia de un algoritmo más general llamado Bootstring , que permite que las cadenas compuestas de un pequeño conjunto de puntos de código 'básicos' representen de forma única cualquier cadena de puntos de código extraídos de un conjunto más grande". Punycode define parámetros para que el algoritmo Bootstring general coincida con las características del texto Unicode. Esta sección muestra el procedimiento para la codificación Punycode, utilizando el ejemplo de la cadena "bücher" ( Bücher es alemán para libros ), que se traduce en la etiqueta "bcher-kva".
Separación de caracteres ASCII
Primero, todos los caracteres ASCII de la cadena se copian de entrada a salida, omitiendo cualquier otro carácter. Por ejemplo, "bücher" se copia en "bcher". Si se copió algún carácter, es decir, había al menos un carácter ASCII en la entrada, se agrega un guión ASCII a la salida siguiente (por ejemplo, "bücher" → "bcher-", pero "ü" → ""). Dado que el guión ASCII es un carácter ASCII, el mismo guión puede aparecer en la salida antes de este guión adicional. Sin embargo, el guión adicional no causa ninguna ambigüedad al leer la salida, ya que ninguna parte posterior del proceso de codificación puede introducir otro guión ASCII; si hay uno o más guiones ASCII en la salida, el último siempre significa el final de los caracteres ASCII.
Codificación de inserciones de caracteres no ASCII como números de código
La siguiente parte del proceso de codificación requiere primero una comprensión del decodificador, que es una máquina de estados finitos con dos variables de estado i y n . i es un índice en la cadena que va desde cero (que representa una inserción potencial al principio) hasta la longitud actual de la cadena extendida (que representa una inserción potencial al final).
i comienza en cero y n comienza en 128 (el primer punto de código no ASCII). La progresión del estado es una función monótona . Un cambio de estado incrementa i o, si i está en su máximo, restablece i a cero e incrementa n en 1, luego vuelve a incrementar i en el siguiente cambio de estado. En cada cambio de estado, se inserta o no se inserta el punto de código denotado por n .
Los números de código generados por el codificador representan cuántas posibilidades se deben omitir antes de realizar una inserción. Hay seis lugares posibles para insertar un carácter en la cadena actual "bcher" (incluso antes del primer carácter y después del último). Hay 124 puntos de código entre el último considerado (127 = 0x7F, el final de ASCII) y "ü" (punto de código 252 = 0xFC, consulte el Suplemento Latin-1 de Unicode ). También hay una posición para insertar una "ü" que debe omitirse (en la posición cero antes de la 'b'). Por eso es necesario decirle al decodificador que salte un total de (6 × 124) + 1 = 745 inserciones posibles antes de llegar a la requerida. Una vez que se inserta el carácter, ahora hay siete lugares posibles para insertar otro carácter.
Recodificación de números de código como secuencias ASCII
Punycode utiliza enteros de longitud variable generalizados para representar estos valores. Por ejemplo, así es como se usa "kva" para representar el número de código 745:
Se utiliza un sistema numérico con ordenamiento little-endian que permite códigos de longitud variable sin delimitadores separados: un dígito menor que un valor de umbral marca que es el dígito más significativo, por lo tanto, el final del número. El valor umbral depende de la posición en el número y también de inserciones previas, para aumentar la eficiencia. En consecuencia, los pesos de los dígitos varían.
En este caso, se utiliza un sistema numérico con 36 símbolos, con la 'a' a la 'z' que no distingue entre mayúsculas y minúsculas igual a los números decimales del 0 al 25, y del '0' al '9' igual a los números decimales del 26 al 35. Por tanto, "kva" corresponde a la cadena de números decimales "10 21 0".
Para decodificar esta cadena de símbolos, se necesitará una secuencia de umbrales, en este caso (1, 1, 26). El umbral comienza como 1 y el peso es 1. El primer símbolo es el valor posicional de las unidades ; 'k' (= 10) con un peso de 1 es igual a 10. Después de esto, se ajusta el valor umbral; en este caso, el umbral es nuevamente 1. El segundo símbolo tiene un valor posicional de 36 menos el valor del umbral anterior, en este caso, 35. Por lo tanto, la suma de los dos primeros símbolos 'k' (= 10) y 'v' (= 21) es 10 × 1 + 21 × 35. Dado que el segundo símbolo no es menor que el valor umbral de 1, habrá más por venir. El peso del tercer símbolo es el peso anterior multiplicado por 36 menos el segundo valor de umbral; 35 × 35. El tercer símbolo en este ejemplo es 'a' (= 0), que es menor que el tercer umbral 26, lo que significa que es la última parte (más significativa) del número. Por lo tanto, "kva" representa el número decimal (10 × 1) + (21 × 35) + (0 × 35 × 35) = 745.
Los propios umbrales se determinan para cada carácter codificado sucesivo mediante un algoritmo que los mantiene entre 1 y 26 inclusive, lo que significa que el último carácter de una codificación siempre será alfabético. El caso se puede utilizar para proporcionar información sobre el caso original de la cadena.
Para la inserción de un segundo carácter especial en "bücher", la primera posibilidad es "büücher" con código "bcher-kvaa", la segunda "bücüher" con código "bcher-kvab", etc. Después de "bücherü" con código " bcher-kvae "viene con códigos que representan la inserción de ý, el carácter que sigue a ü, comenzando con" ýbücher "con el código" bcher-kvaf "(diferente de" übücher "codificado" bcher-jvab "), etc.
Para simplificar los algoritmos de codificación y decodificación, no se ha intentado evitar que algunos valores codificados codifiquen valores Unicode inadmisibles; sin embargo, estos deben comprobarse y detectarse durante la decodificación.
Punycode está diseñado para funcionar en todos los scripts y para ser auto-optimizado al intentar adaptarse a los rangos del juego de caracteres dentro de la cadena mientras opera. Está optimizado para el caso en el que la cadena se compone de cero o más caracteres ASCII y, además, caracteres de solo otro sistema de secuencia de comandos, pero se adaptará a cualquier cadena Unicode arbitraria. Tenga en cuenta que para el uso de DNS, se asume que la cadena de nombre de dominio se ha normalizado mediante Nameprep y (para dominios de nivel superior ) se ha filtrado contra una tabla de idiomas registrada oficialmente antes de codificarse con punycoded, y que el protocolo DNS establece límites en las longitudes aceptables de la cadena de salida Punycode.
Ejemplos de
La siguiente tabla muestra ejemplos de codificaciones Punycode para diferentes tipos de entrada. [2]
Aporte | Punycode de entrada | Descripción de entrada |
---|---|---|
La cuerda vacía. | ||
a | a- | Solo caracteres ASCII, uno en minúsculas. |
A | A- | Solo caracteres ASCII, uno en mayúsculas. |
3 | 3- | Solo caracteres ASCII, uno, un dígito. |
- | - | Solo caracteres ASCII, uno, un guión. |
- | --- | Solo caracteres ASCII, dos guiones. |
Londres | Londres- | Solo caracteres ASCII, más de uno, sin guiones. |
Lloyd-Atkinson | Lloyd-Atkinson- | Solo caracteres ASCII, un guion. |
Esto tiene espacios | Esto tiene espacios | Solo caracteres ASCII, con espacios. |
-> $ 1.00 <- | -> $ 1.00 <- | Solo caracteres ASCII, símbolos mixtos. |
ü | tda | Sin caracteres ASCII, un carácter suplementario Latin-1. |
α | mxa | Sin caracteres ASCII, un carácter griego. |
例 | fsq | Sin caracteres ASCII, un carácter CJK. |
😉 | n28h | Sin caracteres ASCII, un carácter emoji. |
αβγ | mxacd | Sin caracteres ASCII, más de un carácter. |
München | Mnchen-3ya | Cadena mixta, con un carácter que no es un carácter ASCII. |
Mnchen-3ya | Mnchen-3ya- | Punycode de doble codificación de "München". |
München-Ost | Mnchen-Ost-9db | Cadena mixta, con un carácter que no es ASCII y un guión. |
Bahnhof München-Ost | Bahnhof Mnchen-Ost-u6b | Cadena mixta, con un espacio, un guión y un carácter que no es ASCII. |
abæcdöef | abcdef-qua4k | Cadena mixta, dos caracteres no ASCII. |
правда | 80aafi6cg | Ruso, sin ASCII. |
ย จ ฆ ฟ ค ฏ ข | 22cdfh1b8fsa | Tailandés, sin ASCII. |
도메인 | hq1bm8jm9l | Coreano, sin ASCII. |
ド メ イ ン 名 例 | eckwd4c7cu47r2wf | Japonés, sin ASCII. |
Maji で Koi す る 5 秒 前 | MajiKoi5-783gue6qz075azm5e | Japonés con ASCII. |
「Bücher」 | bcher-kva8445foa | Escrituras mixtas no ASCII (Suplemento Latin-1 y CJK). |
Nombres de dominio internacionalizados
Para evitar que los nombres de dominio no internacionales que contienen guiones se interpreten accidentalmente como Punycode, las secuencias de Punycode de nombres de dominio internacionales tienen un prefijo denominado ASCII Compatible Encoding (ACE), "xn--", antepuesto. [3] Por lo tanto, el nombre de dominio "bücher.tld" se representaría en ASCII como "xn - bcher-kva.tld".
Ver también
Referencias
- ^ RFC 3492, Punycode: una codificación Bootstring de Unicode para nombres de dominio internacionalizados en aplicaciones (IDNA) , A. Costello, The Internet Society (marzo de 2003)
- ^ El Punycode en esta tabla fue creado usando el códec incorporado "punycode" del lenguaje de programación Python versión 3.8 (s.encode ("punycode")). Ver página de discusión .
- ^ Autoridad de números asignados de Internet (14 de febrero de 2003). "Finalización de la selección de IANA del prefijo IDNA" . www.atm.tut.fi . Archivado desde el original el 27 de abril de 2010 . Consultado el 22 de septiembre de 2017 .
enlaces externos
- Estándar IETF Punycode
- Demostración de ICU IDNA Una demostración en línea de cómo ICU realiza operaciones de IDN
- Lista de TLD que los desarrolladores de Mozilla consideran que tienen una política eficaz contra la suplantación de identidad para el registro de nombres
- IDN y Punycode en IE7
- Convertidor simple de Punycode
- Convertidor Punycode en línea sobre la marcha basado en la biblioteca de JavaScript Punycode.js
- Convertidor modular en línea que ofrece Punycode y Bootstring