Conversor de Escapes Unicode
Convierte texto a escapes Unicode tipo \u0041 y viceversa
Conversor de Escapes Unicode
Procesando…
0.0
No se ha bloqueado: el resultado aparecerá cuando termine el cálculo.
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
- Introduzca texto normal o una cadena con escapes.
- Elija codificar o decodificar.
- Active o desactive el paso de ASCII y el hexadecimal en mayúsculas (codificar) o los \x como bytes UTF-8 (decodificar).
- 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
- ECMAScript Language Specification: String Literals
- RFC 8259: The JSON Data Interchange Format, Section 7 (Strings)
- Unicode FAQ: UTF-16 and surrogates
- Java Language Specification §3.3 Unicode Escapes
- Python documentation: String and Bytes literals
Revisado el: