Tiếng Việt có thể biểu diễn cùng một chữ theo hai cách Unicode khác nhau: dạng dựng sẵn (NFC), ví dụ "ề" là một code point duy nhất, hoặc dạng tổ hợp (NFD), trong đó "ề" là "e" cộng với hai dấu kết hợp riêng biệt (dấu mũ và dấu huyền) xếp chồng lên nhau. Khi bật tùy chọn escape ký tự ngoài ASCII thành \uXXXX, một chữ "Tiếng Việt" ở dạng NFD có thể tách thành nhiều chuỗi \uXXXX hơn hẳn so với cùng chữ đó ở dạng NFC — cùng nhìn giống hệt nhau trên màn hình nhưng escape ra kết quả khác nhau.
Escape trong chuỗi JavaScript/JSON
Trong chuỗi ký tự của JS và trong JSON, các ký tự đặc biệt được escape bằng dấu gạch chéo ngược: \" cho dấu ngoặc kép, \n cho xuống dòng, \\ cho chính dấu gạch chéo ngược. JSON còn yêu cầu mọi chuỗi phải dùng dấu ngoặc kép — khác với JS, vốn cũng cho phép dấu ngoặc đơn.
Escape trong lệnh shell
Trên dòng lệnh, các ký tự đặc biệt gồm dấu cách, dấu ngoặc kép, ký hiệu đô la, dấu sao và nhiều ký tự khác — chúng mang ý nghĩa riêng đối với shell. Dấu cách trong một tham số lệnh cần được escape hoặc cả tham số phải được đặt trong dấu ngoặc kép, nếu không shell sẽ tách nó thành hai tham số riêng biệt.
Escape trong biểu thức chính quy
Trong biểu thức chính quy, các ký tự như dấu chấm, dấu sao hay dấu ngoặc đơn mang ý nghĩa đặc biệt (bất kỳ ký tự nào, một bộ định lượng, một nhóm). Để khớp chúng theo nghĩa đen thay vì như metacharacter, người ta đặt dấu gạch chéo ngược phía trước: \. khớp một dấu chấm theo nghĩa đen, không phải "bất kỳ ký tự nào".
Vì sao mỗi ngữ cảnh cần cách escape riêng
Lỗi "escape hai lần" hoặc "escape thiếu" là một trong những nguyên nhân phổ biến nhất khiến code bị lỗi khi chèn văn bản người dùng (chẳng hạn đường dẫn file có dấu cách) vào một lệnh hoặc chuỗi ký tự. Cách escape đúng phụ thuộc vào việc văn bản được chèn vào đâu, chứ không phụ thuộc vào bản thân văn bản.
Dùng để làm gì
- Chuẩn bị văn bản tiếng Việt có dấu của người dùng để chèn an toàn vào một request JSON.
- Xây dựng lệnh shell với tham số động mà không có nguy cơ command injection.
- Escape các ký tự đặc biệt trước khi dùng văn bản làm mẫu (pattern) theo nghĩa đen trong biểu thức chính quy.
Escape hai lần trong các ngữ cảnh lồng nhau
Khi văn bản đi qua liên tiếp hai ngữ cảnh — ví dụ một chuỗi được nhúng vào JSON, rồi JSON đó được truyền làm tham số của một lệnh shell — việc escape phải được thực hiện theo đúng thứ tự: trước tiên cho ngữ cảnh bên trong (JSON), sau đó cho ngữ cảnh bên ngoài (shell). Làm sai thứ tự hoặc bỏ sót một tầng là nguyên nhân thường gặp khiến một chuỗi "đã escape đúng" vẫn bị lỗi trong thực tế.