Bảng escape sequence theo ngôn ngữ | \n \t \\ trong JS, Python, Java, C#, JSON
Escape sequence không phải “một bảng chung cho mọi ngôn ngữ”. \n và \t gần như phổ biến, nhưng JSON hẹp hơn JS, Python có raw string, Java \u lan ra ngoài literal, C# có verbatim @"". Khi team Việt Nam nhận ticket Node + Python + mobile Java trong cùng sprint, hãy đối chiếu bảng theo ngôn ngữ trước khi copy-paste. Cần chuyển nhanh newline ↔ \n, mở escape sequence chạy local trên trình duyệt.
Bạn nhận PR: backend Python trả "msg": "Lỗi\\nThử lại", frontend JS JSON.parse rồi render — UI xuống dòng đúng. Sprint sau, mobile Java đọc cùng payload qua thư viện cũ và hiện chữ \n. Không ai “quên escape”; mỗi runtime parse lớp khác nhau. Bài này là bảng tham chiếu theo ngôn ngữ — góc khác với bài debug double-escape — để bạn tra nhanh khi chuyển chuỗi giữa stack.
Ai nên bookmark bài này
- Sinh viên / junior học đồng thời JS và Python
- Freelancer outsourcing nhận fixture JSON từ client rồi port sang Java/C#
- Dev viết test: copy log Windows (
\r\n) sang assert Unix - Reviewer bắt lỗi “string nhìn giống nhau nhưng fail unit test”
Escape sequence là gì (nhắc ngắn)
Escape sequence dùng backslash (\) để biểu diễn ký tự không gõ thẳng trong literal: xuống dòng, tab, ngoặc, Unicode. Bản thân dấu \ cũng phải escape thành \\ nếu muốn một backslash thật.
Ví dụ JS (đủ để nhớ “vì sao cần escape”):
// Sai — đóng string sớm
const bad = "Anh ấy nói "xin chào"";
// Đúng
const ok = "Anh ấy nói \"xin chào\"";
const twoLines = "dòng1\ndòng2";
Bảng chung: ký tự hay gặp
| Trong source / JSON | Nghĩa |
|---|---|
\n | Newline / LF (U+000A) |
\r | Carriage return / CR (U+000D) |
\r\n | CR+LF — xuống dòng Windows cổ điển |
\t | Tab ngang (U+0009) |
\\ | Một ký tự backslash |
\" | Dấu ngoặc kép trong literal "..." |
\' | Dấu ngoặc đơn (JS/Python/Java… — không có trong JSON) |
\uXXXX | Unicode 4 hex (vd. \u00A0 non-breaking space) |
Bảng theo ngôn ngữ (điểm khác quan trọng)
JavaScript / TypeScript
| Escape | Hỗ trợ | Ghi chú thực tế |
|---|---|---|
\n \t \r \\ \" \' | Có | Template literal ` cho phép newline thật không cần \n |
\uXXXX \u{...} | Có | ES6: \u{1F600} cho code point ngoài BMP |
\xHH | Có | Hex 2 chữ số — không hợp lệ trong JSON |
| Raw string | Không (kiểu Python) | Dùng String.raw hoặc template nếu cần |
const a = "line1\nline2";
const b = `line1
line2`; // cùng ý nghĩa runtime, khác cách viết
JSON.stringify("a\nb"); // → "\"a\\nb\"" trên wire
Python
| Escape | Hỗ trợ | Ghi chú thực tế |
|---|---|---|
\n \t \r \\ \" \' | Có | Triple-quote """...""" cho phép newline thật |
\uXXXX \UXXXXXXXX \xHH \N{NAME} | Có | Phong phú hơn JSON |
Raw r"..." | Có | Backslash gần như literal — regex/path |
| f-string | Có | Escape vẫn áp dụng trong phần literal của f-string |
s = "a\nb" # có newline
raw = r"a\nb" # hai ký tự \ và n
path = r"C:\Users\a\file.txt" # tránh nhân đôi \\
Lỗi hay gặp: Copy r"C:\new\test" rồi tưởng \n là newline — trong raw string nó không xuống dòng.
Java
| Escape | Hỗ trợ | Ghi chú thực tế |
|---|---|---|
\n \t \r \\ \" \' | Có | Text block (Java 15+) giảm nhu cầu \n |
\uXXXX | Có mọi nơi trong source | \u0022 thậm chí thay " ngoài string — dễ gây “code ma” |
\xHH | Không | Khác JS |
String s = "a\nb";
// \\u000A cũng là newline — kể cả nếu viết ngoài chuỗi (cẩn thận)
C#
| Escape | Hỗ trợ | Ghi chú thực tế |
|---|---|---|
\n \t \r \\ \" | Có | Verbatim @"C:\temp\a.txt" giữ \ |
\uXXXX \UXXXXXXXX \x | Có (trong string) | Khác Java: không “xâm chiếm” toàn bộ source |
Raw string literal """...""" | Có (C# 11+) | Giống ý tưởng text block |
var s = "a\nb";
var path = @"C:\Users\a\file.txt";
var jsonish = "\"a\\nb\""; // đã nghĩ tới lớp JSON chưa?
PHP
| Escape | Hỗ trợ | Ghi chú |
|---|---|---|
"..." với \n \t… | Có | Single-quoted '...' gần như không interpret \n (trừ \\ và \') |
| Nowdoc / Heredoc | Có | Tách biệt escape vs text thuần |
Go
| Escape | Hỗ trợ | Ghi chú |
|---|---|---|
"..." interpreted | Có | \n \t \u \U \x |
`raw` | Có | Raw string: không escape — path và regex sạch |
JSON (không phải “ngôn ngữ”, nhưng là lớp wire)
JSON chặt hơn hầu hết ngôn ngữ:
- Cho phép:
\"\\\/\b\f\n\r\t\uXXXX - Cấm:
\',\xHH, newline thật chưa escape trong string, comment
{ "ok": "dòng1\ndòng2" }
Paste từ JS '\n' (single quote) hoặc từ C# verbatim vào file .json mà không chuẩn hóa → Unexpected token.
Ma trận nhanh: copy từ A sang B
| Nguồn → đích | Rủi ro chính | Việc cần làm |
|---|---|---|
| JS → JSON | \x / \' / template newline | Chỉ giữ escape JSON; dùng JSON.stringify |
| Python raw → JS | r"\\n" thành literal | Quyết định muốn newline thật hay hai ký tự \n |
| Windows log → assert Unix | \r\n vs \n | Normalize trước khi so sánh |
Java \u → C# | \u ngoài string | Chỉ giữ trong literal C# |
| Path Windows → JSON | Mỗi \ thành \\ | Đếm backslash hoặc dùng / |
Case study 1: Fixture JSON từ client Windows
Client gửi file:
C:\Orders\new\report.csv
Bạn nhét vào JSON bằng tay:
{ "path": "C:\Orders\new\report.csv" }
Parser đọc \n trong \new như newline → JSON vỡ hoặc path sai. Đúng:
{ "path": "C:\\Orders\\new\\report.csv" }
Hoặc tốt hơn: forward slash nếu API chấp nhận. Trước khi sửa service, dán path vào escape sequence, bấm Escape, xem backslash đã nhân đôi chưa.
Case study 2: Cùng \n — ba lớp trong một ticket
- Source Python:
"Lỗi\nThử lại"→ runtime có newline - JSON wire:
"Lỗi\\nThử lại"→ trên file thấy hai ký tự\n - Log đã stringify lần nữa:
"Lỗi\\\\nThử lại"→ UI hiện chữ\n
Bảng ngôn ngữ giúp viết đúng lớp 1. Lớp 2–3 là serializer — đừng “sửa bằng thêm/bớt \ theo cảm giác”; đếm lớp rồi Escape/Unescape một lần có chủ đích.
Checklist trước khi merge chuỗi đa ngôn ngữ
- Chuỗi đích là source, JSON, hay regex?
- Ngôn ngữ đích có raw / verbatim / text block không — có đang tắt escape không?
- Có ký tự ngoài BMP không — cần
\u{...}(JS) hay\U(Python/C#)? - File từ Windows — đã normalize
\r\n? - Đã thử mẫu 2–3 dòng trên tool local chưa?
Quy trình 30 giây với Kawa
- Mở chuyển đổi escape sequence
- Dán text có xuống dòng thật → Escape → copy vào literal/JSON
- Hoặc dán chuỗi đầy
\n→ Unescape để đọc log - Che PII trước khi paste bất kỳ đâu (kể cả tool local)
Tool chạy trên trình duyệt, không cần đăng ký — phù hợp log nội bộ team outsourcing.
FAQ ngắn trong bài
Có cần học hết escape của mọi ngôn ngữ?
Không. Thuộc \n \t \\ \" và quy tắc JSON là đủ 80% công việc. Tra bảng khi đụng raw string, \u Java, hoặc path Windows.
Template literal / text block có thay escape không?
Giảm nhu cầu \n cho văn bản nhiều dòng, nhưng khi đưa sang JSON bạn vẫn phải escape trên wire.
Liên kết liên quan
- Công cụ escape sequence — Escape / Unescape
\n\ttrên trình duyệt - Danh sách công cụ
- Bài debug lớp encoding (góc khác): nếu bạn đang thấy chữ
\ntrên UI, đọc thêm hướng dẫn phân biệt runtime / JSON / double-escape trong cụm bài escape trên blog VI
Tóm lại: Bookmark bài này như bảng tra ngôn ngữ. Khi sprint xen Node, Python và Java, mở bảng trước khi “thêm một dấu \ nữa”.
)