Sequências de escape
Quase todo bug de escape é um erro de contexto em vez de um erro de sintaxe. O caractere é conhecido — uma aspa, uma barra invertida, um e-comercial — e o que é pouco claro é qual das seis regras conflitantes se aplica onde a string está prestes a pousar.
Então, esta tabela é organizada por contexto, não por caractere. A mesma aspa é duplicada em uma célula CSV, escapada com barra invertida em JSON, transformada em " em HTML e deixada completamente intacta entre aspas simples em um shell. Quatro linhas, quatro regras, um caractere.
A regra que mais importa é aquela que as pessoas buscam por último: escape no limite que o valor está cruzando, e escape-o uma vez. Texto que é escapado duas vezes — um & na origem da página, um \\n no arquivo de saída — é a assinatura de um valor que passou por dois codificadores que cada um assumiu que eram os primeiros.
Strings JSON
10JSON permite exatamente esses escapes. Uma nova linha ou abas literal dentro de uma string é inválida.
| Escape | Significa | Quando você precisa disso | Em contexto |
|---|---|---|---|
| \" | " | Uma aspa dupla dentro de uma string | "say \"hi\"" |
| \\ | \ | Uma barra invertida literalA razão pelos quais os caminhos do Windows quebram JSON. | "C:\\dir" |
| \/ | / | Uma barra invertida — opcionalLegal mas desnecessário; um hábito de incorporar JSON em tags <script>. | "a\/b" |
| \n | U+000A | Um avanço de linha | "line\nline" |
| \r | U+000D | Um retorno de carro | |
| \t | U+0009 | Uma guia | |
| \b | U+0008 | Um backspace | |
| \f | U+000C | Um avanço de página | |
| \u00e9 | é | Qualquer caractere por seu ponto de código de quatro dígitos | "caf\u00e9" |
| \ud83d\ude00 | 😀 | Um caractere acima de U+FFFF, como um par substituoJSON não tem forma \u{…}, então caracteres astrais levam dois escapes. |
Strings JavaScript
10Um superconjunto do JSON, além dos escapes de literais de modelo.
| Escape | Significa | Quando você precisa disso | Em contexto |
|---|---|---|---|
| \' | ' | Uma aspa simples dentro de uma string entre aspas simples | |
| \" | " | Uma aspa dupla dentro de uma string entre aspas duplas | |
| \` | ` | Um backtick dentro de um literal de modelo | |
| \${ | ${ | Um literal ${ dentro de um literal de modeloSem a barra invertida, inicia uma interpolação. | |
| \n | U+000A | Um avanço de linha | |
| \xe9 | é | Um caractere por dois dígitos hexadecimais, até U+00FF | |
| \u00e9 | é | Um caractere por quatro dígitos hexadecimais | |
| \u{1f600} | 😀 | Qualquer ponto de código, no matter how longNão precisa de par substituo, ao contrário da forma de quatro dígitos. | |
| \0 | U+0000 | Um caractere nulo | |
| \u2028 | U+2028 | Separador de linhaVálido em uma string JS mas não em JSON — uma falha JSONP clássica. |
Texto e atributos HTML
8Apenas & e < estritamente devem ser escapados no texto; aspas importam dentro de atributos.
| Escape | Significa | Quando você precisa disso | Em contexto |
|---|---|---|---|
| & | & | Um e-comercialEscape este primeiro, ou qualquer outro escape dobra. | |
| < | < | Um sinal de menos-que, para que não comece uma tag | |
| > | > | Um sinal maior que | |
| " | " | Uma aspa dupla dentro de um atributo | |
| ' | ' | Uma aspa simples dentro de um atributo' também funciona em HTML5, mas a forma numérica é segura em todos os lugares. | |
| | U+00A0 | Um espaço não-quebrável | |
| é | é | Qualquer caractere por ponto de código decimal | |
| é | é | Qualquer caractere por ponto de código hexadecimal |
URLs (codificação de porcentagem)
9Quais caracteres precisam de escape dependem da parte da URL em que estão.
| Escape | Significa | Quando você precisa disso | Em contexto |
|---|---|---|---|
| %20 | Um espaço, válido em qualquer lugar em uma URL | ||
| + | Um espaço, mas apenas em uma string de consulta codificada por formulárioEm um segmento de caminho, é um sinal de mais literal. | ||
| %25 | % | Um sinal de porcentagem literalPerca isto e o valor decodifica duas vezes. | |
| %2F | / | Uma barra invertida dentro de um segmento de caminho único | |
| %3F | ? | Um ponto de interrogação dentro de um valor | |
| %26 | & | Um e-comercial dentro de um valor de parâmetro | |
| %3D | = | Um sinal de igual dentro de um valor de parâmetro | |
| %23 | # | Um hash, para que não comece o fragmento | |
| %C3%A9 | é | Um caractere não-ASCII, como seus bytes UTF-8Um caractere pode se tornar dois, três ou quatro grupos de porcentagem. |
Campos CSV
5RFC 4180: cite o campo, depois duplique qualquer aspa dentro dele. Barras invertidas não significam nada.
| Escape | Significa | Quando você precisa disso | Em contexto |
|---|---|---|---|
| "" | " | Uma aspa dentro de um campo entre aspas — duplique-a | "say ""hi""" |
| "a,b" | , | Um campo contendo o delimitador — cite o campo | |
| "a b" | U+000A | Um campo contendo uma quebra de linha — cite o campo | |
| " a" | Preserve espaços iniciais ou finaisSem aspas, muitos analisadores os aparaçam. | ||
| '=SUM(A1) | = | Pare uma planilha de executar a célula como uma fórmulaAplica-se a valores começando =, +, - ou @. Esta é injeção de fórmula. |
Literais e identificadores SQL
6Leia esses; não os escreva. Use consultas parametrizadas.
| Escape | Significa | Quando você precisa disso | Em contexto |
|---|---|---|---|
| '' | ' | Uma aspa dentro de um literal de string — duplique-a | 'O''Brien' |
| "order" | order | Uma palavra reservada usada como nome de colunaAspas duplas são o padrão; SQL Server usa [brackets]. | |
| `order` | order | O mesmo no MySQL e MariaDB | |
| \% | % | Um% literal dentro de um padrão LIKE | |
| \_ | _ | Um _ literal dentro de um padrão LIKE | |
| $tag$ … $tag$ | ' | Citação em dólar PostgreSQL — sem escape algum dentroÚtil para corpos de código, onde duplicar cada aspa não é legível. |
Argumentos de shell
6Aspas simples são literais, aspas duplas ainda expandem variáveis.
| Escape | Significa | Quando você precisa disso | Em contexto |
|---|---|---|---|
| '…' | $ ` \ | Tudo dentro é literalA cotação mais segura que existe — mas não pode conter uma aspa simples. | |
| "…" | * ? space | Globs e espaços são seguros, as variáveis ainda se expandemAlways quote variables: "$var", never bare $var. | |
| \ | Um espaço em um nome de arquivo sem aspas | ||
| \$ | $ | Um sinal de dólar literal dentro de aspas duplas | |
| \` | ` | Um backtick literal, não uma substituição de comando | |
| '\'' | ' | Uma aspa simples dentro de aspas simplesFechar, escapar, reabrir — não há forma de aninhar direto. |