Conversor de Escapes Unicode

Convierte texto a escapes Unicode tipo \u0041 y viceversa

Conversor de Escapes Unicode

TextoEscapes \u
Entrada
Resultado

Acerca de Conversor de Escapes Unicode

Al codificar, la herramienta escribe cada carácter como \uXXXX en unidades de código UTF-16. Lo que queda fuera del plano multilingüe básico —emojis, ideogramas suplementarios— se convierte en un par sustituto, así que 😀 pasa a ser \ud83d\ude00, doce caracteres. Al decodificar reconoce cuatro formas: \uXXXX, \u{1F600}, el \U0001F600 de Python y \xXX; el resto del texto queda igual.

Las secuencias de JSON, JavaScript, Java y C# se parecen tanto que invitan a usarlas indistintamente, pero cada lenguaje acepta formas distintas y las procesa en momentos distintos.

Cómo 😀 se convierte en \uD83D\uDE00

\u admite exactamente cuatro dígitos hexadecimales, así que solo llega hasta U+FFFF. Los puntos de código mayores se dividen al estilo UTF-16: a U+1F600 se le resta 0x10000 y queda 0xF600, un valor de 20 bits. Sus diez bits altos (0x3D) sumados a 0xD800 dan el sustituto alto D83D; los diez bajos (0x200) sumados a 0xDC00 dan el sustituto bajo DE00.

Unicode reserva todo el rango D800–DFFF para esto y nunca asigna caracteres allí. Una cadena con \uD83D suelto está rota: es un sustituto huérfano, y al pasarla a UTF-8 se convierte en U+FFFD (�) o da error. Si el decodificador produce un sustituto huérfano, muestra un aviso con el número de casos bajo el resultado; compruebe entonces si la entrada se cortó a mitad de un par (algo típico al truncar con substring() a longitud fija).

El mismo emoji en seis sintaxis

El decodificador lee las tres primeras (de Python, solo la forma \U) y \xXX. La forma \N{NOMBRE} requeriría toda la tabla de nombres Unicode, así que no se admite y se deja tal cual.

  • JSON, Java, C#, JavaScript anterior a 2015: \uD83D\uDE00 — el par es obligatorio
  • JavaScript desde ES2015: \u{1F600} — no válido en JSON
  • Python 3: \U0001F600 (U mayúscula, ocho dígitos) o \N{GRINNING FACE}
  • CSS: \1F600 seguido de un espacio que cierra la secuencia
  • HTML: 😀 o 😀
  • URL: %F0%9F%98%80 — los bytes UTF-8 en codificación porcentual

Por qué \xc3\xb1 no da ñ

En Python, 'ñ'.encode() se imprime como b'\xc3\xb1': dos bytes UTF-8. En JavaScript, \xXX significa otra cosa: un carácter entre U+0000 y U+00FF. Por defecto esta herramienta sigue a JavaScript, así que \xc3\xb1 se decodifica como ñ, justo el texto corrupto que aparece cuando UTF-8 se lee como Latin-1 o Windows-1252 («España»). Si activa «Leer las series de \x como bytes UTF-8» al decodificar, cada serie de \x seguidos se reúne como bytes y se decodifica en UTF-8, y sale ñ. Los bytes que no forman UTF-8 válido dan U+FFFD.

El comentario de Java que rompe la compilación

Java traduce \uXXXX en todo el archivo fuente antes de separarlo en tokens (Especificación del Lenguaje Java, §3.3), no solo dentro de las cadenas. Un \u000a dentro de un comentario // se convierte en un salto de línea real y lo que sigue se interpreta como código; un \u0022 dentro de una cadena la cierra. Use \n y \" dentro de las cadenas. JavaScript y JSON solo interpretan escapes dentro de literales, así que no tienen esta trampa.

Cuándo sigue valiendo la pena escapar

Aunque UTF-8 es hoy lo normal, los escapes siguen siendo útiles: los archivos .properties de Java anteriores a Java 9 se leían como ISO-8859-1 (por eso la ñ y las tildes se guardaban como \u00f1, \u00e1); algunas cadenas de compilación aún adivinan la codificación; y en registros o revisiones de código un escape deja claro lo que no se ve: \u00a0 en vez de un espacio, \u200b en vez de nada, \u0430 (а cirílica) en vez de una a latina.

Con «Mantener letras, números y símbolos ASCII tal cual» activado solo queda literal el ASCII imprimible (0x20–0x7E); tabuladores y saltos salen como \u0009 y \u000a.

Ejemplos

Tilde, ñ y emoji juntos

Entrada
áñ😀
Resultado
\u00e1\u00f1\ud83d\ude00

á y ñ están en el BMP (un escape cada una); 😀 necesita un par sustituto. Sirve tal cual dentro de una cadena JSON.

Decodificar escapes de ES2015

Entrada
\u{1F600} \u{F1}
Resultado
😀 ñ

Entre llaves caben de uno a seis dígitos; valores por encima de 10FFFF se dejan como están.

Los escapes de bytes no son UTF-8

Entrada
\xc3\xb1
Resultado
Por defecto: ñ / opción de bytes UTF-8: ñ

Por defecto cada \x es un carácter Latin-1, así que los dos bytes UTF-8 de la ñ se convierten en dos caracteres distintos. La opción los lee como bytes.

Cómo se usa

  1. Introduzca texto normal o una cadena con escapes.
  2. Elija codificar o decodificar.
  3. Active o desactive el paso de ASCII y el hexadecimal en mayúsculas (codificar) o los \x como bytes UTF-8 (decodificar).
  4. Copie el resultado.

Preguntas frecuentes

¿Por qué un emoji da dos escapes \u?

Los caracteres por encima de U+FFFF ocupan dos unidades UTF-16 (un par sustituto) y cada \uXXXX solo representa una.

¿Puedo usar \u{1F600} en JSON?

No. El RFC 8259 solo admite \u con cuatro dígitos; fuera del BMP hay que escribir el par sustituto o incluir el carácter en UTF-8.

¿Decodifica el \U0001F600 de Python?

Sí, la forma de ocho dígitos se decodifica. Los escapes con nombre como \N{GRINNING FACE} no se admiten y se dejan sin cambios.

Tras decodificar veo un cuadrado en lugar del emoji.

Seguramente es un sustituto huérfano: en la entrada solo estaba la mitad del par. La herramienta muestra un aviso en ese caso.

Guías relacionadas

Fuentes

Revisado el:

Privacidad y tratamiento de datos