Secuencias de escape
Casi todo error de escapado es un error de contexto en lugar de un error de sintaxis. El carácter es conocido—una comilla, una barra invertida, un ampersand—y lo que no está claro es cuál de seis reglas conflictivas se aplica donde la cadena está a punto de aterrizar.
Por eso esta tabla está organizada por contexto, no por carácter. La misma comilla se duplica en una celda CSV, se escapa con barra invertida en JSON, se convierte en " en HTML y se deja completamente sola dentro de comillas simples en shell. Cuatro filas, cuatro reglas, un carácter.
La regla que más importa es la que la gente busca último: escapar en el límite que el valor cruza, y escaparlo una vez. El texto que se escapa dos veces—un & en el código fuente de la página, un \\n en el archivo de salida—es la firma de un valor que pasó por dos codificadores que cada uno asumía que eran primeros.
Cadenas JSON
10JSON permite exactamente estos escapes. Una nueva línea o tabulación literal dentro de una cadena es inválida.
| Escapado | Significa | Cuándo lo necesitas | En contexto |
|---|---|---|---|
| \" | " | Una comilla doble dentro de una cadena | "say \"hi\"" |
| \\ | \ | Una barra invertida literalLa razón por la que las rutas de Windows rompen JSON. | "C:\\dir" |
| \/ | / | Una barra diagonal—opcionalLegal pero innecesario; un hábito de incrustar JSON en etiquetas <script>. | "a\/b" |
| \n | U+000A | Un salto de línea | "line\nline" |
| \r | U+000D | Un retorno de carro | |
| \t | U+0009 | Una tabulación | |
| \b | U+0008 | Un espacio atrás | |
| \f | U+000C | Una alimentación de formulario | |
| \u00e9 | é | Cualquier carácter por su punto de código de cuatro dígitos | "caf\u00e9" |
| \ud83d\ude00 | 😀 | Un carácter arriba de U+FFFF, como una pareja sustitutaJSON no tiene forma \u{…}, así que los caracteres astrales toman dos escapes. |
Cadenas JavaScript
10Un superconjunto del de JSON, más los escapes de literal de plantilla.
| Escapado | Significa | Cuándo lo necesitas | En contexto |
|---|---|---|---|
| \' | ' | Una comilla simple dentro de una cadena entrecomillada simple | |
| \" | " | Una comilla doble dentro de una cadena entrecomillada doble | |
| \` | ` | Una comilla invertida dentro de un literal de plantilla | |
| \${ | ${ | Un ${literal dentro de un literal de plantillaSin la barra invertida comienza una interpolación. | |
| \n | U+000A | Un salto de línea | |
| \xe9 | é | Un carácter por dos dígitos hexadecimales, hasta U+00FF | |
| \u00e9 | é | Un carácter por cuatro dígitos hexadecimales | |
| \u{1f600} | 😀 | Cualquier punto de código, sin importar cuánto tiempoNo necesita una pareja sustituta, a diferencia de la forma de cuatro dígitos. | |
| \0 | U+0000 | Un carácter nulo | |
| \u2028 | U+2028 | Separador de líneaVálido en una cadena JS pero no en JSON—un clásico quebrantamiento de JSONP. |
Texto e atributos HTML
8Solo & e < deben escaparse estrictamente en texto; las comillas importan dentro de atributos.
| Escapado | Significa | Cuándo lo necesitas | En contexto |
|---|---|---|---|
| & | & | Un ampersandEscapa este primero, o cada otro escape se duplica. | |
| < | < | Un signo de menor que, para que no comience una etiqueta | |
| > | > | Un signo de mayor que | |
| " | " | Una comilla doble dentro de un atributo | |
| ' | ' | Una comilla simple dentro de un atributo' también funciona en HTML5, pero la forma numérica es segura en todas partes. | |
| | U+00A0 | Un espacio sin ruptura | |
| é | é | Cualquier carácter por punto de código decimal | |
| é | é | Cualquier carácter por punto de código hexadecimal |
URLs (codificación de porcentaje)
9Qué caracteres necesitan escaparse depende de la parte de la URL en la que se encuentren.
| Escapado | Significa | Cuándo lo necesitas | En contexto |
|---|---|---|---|
| %20 | Un espacio, válido en cualquier parte de una URL | ||
| + | Un espacio, pero solo en una cadena de consulta codificada en formaEn un segmento de ruta esto es un signo más literal. | ||
| %25 | % | Un signo de porcentaje literalPierde esto e el valor decodifica dos veces. | |
| %2F | / | Una barra dentro de un segmento de ruta único | |
| %3F | ? | Un signo de pregunta dentro de un valor | |
| %26 | & | Un ampersand dentro de un valor de parámetro | |
| %3D | = | Un signo de igual dentro de un valor de parámetro | |
| %23 | # | Un hash, para que no comience el fragmento | |
| %C3%A9 | é | Un carácter que no es ASCII, como sus bytes UTF-8Un carácter puede convertirse en dos, tres o cuatro grupos de porcentaje. |
Campos CSV
5RFC 4180: entrecomillar el campo, luego duplicar cualquier comilla interior. Las barras invertidas no significan nada.
| Escapado | Significa | Cuándo lo necesitas | En contexto |
|---|---|---|---|
| "" | " | Una comilla dentro de un campo entrecomillado—duplicala | "say ""hi""" |
| "a,b" | , | Un campo que contiene el delimitador—entrecomillar el campo | |
| "a b" | U+000A | Un campo que contiene un salto de línea—entrecomillar el campo | |
| " a" | Conserva espacios iniciales o finalesSin entrecomillar, muchos analizadores los recortan. | ||
| '=SUM(A1) | = | Detener que la hoja de cálculo ejecute la celda como una fórmulaSe aplica a valores que comienzan =, +, - o @. Esto es inyección de fórmula. |
Literales e identificadores SQL
6Lee estos; no los escribas. Usa consultas parametrizadas en su lugar.
| Escapado | Significa | Cuándo lo necesitas | En contexto |
|---|---|---|---|
| '' | ' | Una comilla dentro de un literal de cadena—duplicala | 'O''Brien' |
| "order" | order | Una palabra reservada usada como nombre de columnaLas comillas dobles son el estándar; SQL Server usa [brackets]. | |
| `order` | order | Lo mismo en MySQL e MariaDB | |
| \% | % | Un % literal dentro de un patrón LIKE | |
| \_ | _ | Un _ literal dentro de un patrón LIKE | |
| $tag$ … $tag$ | ' | Entrecomillado con dólar de PostgreSQL—sin escapar nada en absolutoÚtil para cuerpos de código, donde duplicar cada comilla es ilegible. |
Argumentos de shell
6Las comillas simples son literales, las comillas dobles aún expanden variables.
| Escapado | Significa | Cuándo lo necesitas | En contexto |
|---|---|---|---|
| '…' | $ ` \ | Todo adentro es literalEl entrecomillado más seguro que existe—pero no puede contener una comilla simple. | |
| "…" | * ? space | Glob e espacios son seguros, las variables aún se expandenAlways quote variables: "$var", never bare $var. | |
| \ | Un espacio en un nombre de archivo sin entrecomillar | ||
| \$ | $ | Un signo de dólar literal dentro de comillas dobles | |
| \` | ` | Una comilla invertida literal, no una sustitución de comando | |
| '\'' | ' | Una comilla simple dentro de comillas simplesCierra, escapa, reabre—no hay forma de anidarlo directamente. |