Послідовності екранування
Майже кожна помилка екранування — це помилка контексту, а не помилка синтаксису. Символ відомий — лапки, зворотний слеш, амперсанд — і невясно, яке із шести конфліктуючих правил застосовується там, де рядок збирається потрапити.
Отже, ця таблиця організована за контекстом, а не за символом. Ті самі лапки подвоюються в клітинці CSV, екрануються зворотним слешем у JSON, перетворюються на " у HTML і залишаються абсолютно безхідними всередину одиничних лапок у оболонці. Чотири рядки, чотири правила, один символ.
Правило, що має найбільше значення, — це те, яке люди дістають останніми: екранувати на межі, що значення перетинає, і екранувати його один раз. Текст, який екранується двічі — & у вихідному коді сторінки, \\n у файлі виходу — це сигнатура значення, що пройшло через два кодери, які обидва вважали себе першими.
Рядки JSON
10JSON дозволяє саме ці екранування. Буквальна перерва або табуляція всередину рядка недійсна.
| Екран | Означає | Коли вам це потрібно | У контексті |
|---|---|---|---|
| \" | " | Подвійна лапка всередину рядка | "say \"hi\"" |
| \\ | \ | Літеральний зворотний слешПричина того, що шляхи Windows ламають JSON. | "C:\\dir" |
| \/ | / | Прямий слеш — необов'язковийЗаконний, але непотрібний; звичай від вбудовування JSON у <script> теги. | "a\/b" |
| \n | U+000A | Подача рядка | "line\nline" |
| \r | U+000D | Повернення каретки | |
| \t | U+0009 | Табуляція | |
| \b | U+0008 | Зворотне простір | |
| \f | U+000C | Форма подачі | |
| \u00e9 | é | Будь-який символ за його чотирьохзначною кодовою точкою | "caf\u00e9" |
| \ud83d\ude00 | 😀 | Символ вище U+FFFF як пара замінникаJSON не має \u{…} форми, тож астральні символи займають два екранування. |
Рядки JavaScript
10Надмножина JSON, плюс екранування літерального шаблону.
| Екран | Означає | Коли вам це потрібно | У контексті |
|---|---|---|---|
| \' | ' | Одиничний лапки всередину односторонньої лапки рядка | |
| \" | " | Подвійна лапка всередину двостороннього лапки рядка | |
| \` | ` | Зворотний лапки всередину літерального шаблону | |
| \${ | ${ | Літеральне ${ всередину літерального шаблонуБез зворотного слеша це починає інтерполяцію. | |
| \n | U+000A | Подача рядка | |
| \xe9 | é | Символ на двох шістнадцяткових цифр, до U+00FF | |
| \u00e9 | é | Символ на чотирьох шістнадцяткових цифр | |
| \u{1f600} | 😀 | Будь-яка кодова точка, однак довгийНе потребує пари замінника, на відміну від чотирьохзначної форми. | |
| \0 | U+0000 | Нульовий символ | |
| \u2028 | U+2028 | Роздільник рядківДійсний у рядку JS, але не в JSON — класична розбиття JSONP. |
Текст HTML й атрибути
8Лише & й < строго повинні екрануватись у текстові; лапки мають значення всередину атрибутів.
| Екран | Означає | Коли вам це потрібно | У контексті |
|---|---|---|---|
| & | & | АмперсандЕкранувати цей спочатку, або кожен інший екран подвойюється. | |
| < | < | Знак менше-ніж, так воно не починає тег | |
| > | > | Знак більше-ніж | |
| " | " | Подвійна лапка всередину атрибута | |
| ' | ' | Одиничний лапки всередину атрибута' також працює в HTML5, але числова форма безпечна скрізь. | |
| | U+00A0 | Неперевирна пробіл | |
| é | é | Будь-який символ по десятковій кодовій точці | |
| é | é | Будь-який символ по шістнадцятковій кодовій точці |
URL (екранування відсотком)
9Які символи потрібно екранувати залежить від частини URL, де вони сидять.
| Екран | Означає | Коли вам це потрібно | У контексті |
|---|---|---|---|
| %20 | Пробіл, дійсний скрізь у URL | ||
| + | Пробіл, але лише в рядку запиту, кодованому формою.У сегменті шляху це буквальний знак плюса. | ||
| %25 | % | Літеральний знак відсоткаПропустити це й значення декодується двічі. | |
| %2F | / | Слеш всередину сегмента одного шляху | |
| %3F | ? | Знак питання всередину значення | |
| %26 | & | Амперсанд всередину значення параметра | |
| %3D | = | Знак рівності всередину значення параметра | |
| %23 | # | Гаш, так воно не починає фрагмент | |
| %C3%A9 | é | Символ не-ASCII як його UTF-8 байтиОдин символ може стати двома, трьома або чотирма групами відсотків. |
Поля CSV
5RFC 4180: обгорніть поле в лапки, потім подвойте будь-які лапки всередину нього. Зворотні слеші нічого не означають.
| Екран | Означає | Коли вам це потрібно | У контексті |
|---|---|---|---|
| "" | " | Лапки всередину цитованого поля — подвойте її | "say ""hi""" |
| "a,b" | , | Поле, що містить розмежувач — обгорніть поле | |
| "a b" | U+000A | Поле, що містить розрив рядка — обгорніть поле | |
| " a" | Зберегти провідне або кінцеве місцеНевідзначено, багато парсерів обрізали їх. | ||
| '=SUM(A1) | = | Зупинити виконання клітинки як формулиЗастосовується до значень, що починаються з =, +, - або @. Це впровадження формули. |
Літерали й ідентифікатори SQL
6Прочитайте їх; не пишіть їх. Замість цього використовуйте параметризовані запити.
| Екран | Означає | Коли вам це потрібно | У контексті |
|---|---|---|---|
| '' | ' | Лапки всередину рядка буквально — подвойте її | 'O''Brien' |
| "order" | order | Зарезервоване слово, що використовується як назва стовпцяПодвійні лапки — стандарт; SQL Server використовує [brackets]. | |
| `order` | order | Те саме в MySQL й MariaDB | |
| \% | % | Літеральний % всередину шаблону LIKE | |
| \_ | _ | Літеральний _ всередину шаблону LIKE | |
| $tag$ … $tag$ | ' | PostgreSQL доларовий лапки — без екранування всередину взагаліКорисно для органів коду, де подвоєння кожного лапки нечитаний. |
Аргументи оболонки
6Одиничні лапки буквальні, подвійні лапки все ще розширюють змінні.
| Екран | Означає | Коли вам це потрібно | У контексті |
|---|---|---|---|
| '…' | $ ` \ | Все всередину буквальнеНайбезпечніший лапки — але воно не може містити одиничні лапки. | |
| "…" | * ? space | Глобуси й пробіли безпечні, змінні все ще розширюютьAlways quote variables: "$var", never bare $var. | |
| \ | Пробіл у невідзначеному імені файлу | ||
| \$ | $ | Літеральний знак долара всередину подвійних лапок | |
| \` | ` | Літеральний зворотний слеш, а не заміна команди | |
| '\'' | ' | Одиничні лапки всередину одиничних лапокЗакрити, екранувати, повторно відкрити — немає способу гніздувати його безпосередньо. |