Thoát chuỗi là quá trình chèn dấu gạch chéo ngược (hoặc ký hiệu khác) trước các ký tự có ý nghĩa đặc biệt bên trong một chuỗi ký tự. Khi trình phân tích cú pháp của ngôn ngữ lập trình gặp dấu nháy kép bên trong một chuỗi được bao bởi dấu nháy kép, nó sẽ coi đó là dấu kết thúc chuỗi. Thoát dấu nháy bằng dấu gạch chéo ngược — viết \" thay vì " — cho trình phân tích biết đây là ký tự thực sự, không phải dấu phân cách. Mọi ngôn ngữ sử dụng chuỗi ký tự đều có quy tắc thoát, dù các chuỗi cụ thể có thể khác nhau.
Các chuỗi thoát phổ biến nhất ánh xạ tới khoảng trắng và ký tự điều khiển không thể xuất hiện trực tiếp trong mã nguồn. Dòng mới trở thành \n, tab trở thành \t, và dấu gạch chéo ngược thực sự trở thành \\. Các quy ước này bắt nguồn từ ngôn ngữ lập trình C (ISO/IEC 9899) và đã được JavaScript (ECMA-262), Python, Java, Go và Rust áp dụng. JSON (RFC 8259) sử dụng cú pháp tương tự nhưng hỗ trợ tập hợp chuỗi thoát nhỏ hơn.
Bỏ thoát (đôi khi gọi là "de-escaping") là thao tác ngược lại: chuyển đổi các chuỗi thoát trở lại thành ký tự gốc. Thao tác này thường gặp khi đọc file log, phân tích phản hồi API hoặc gỡ lỗi dữ liệu đã bị thoát hai lần. Cả hai thao tác đều mang tính cơ học và dễ mắc lỗi khi thực hiện thủ công, đó là lý do các lập trình viên sử dụng công cụ thoát/bỏ thoát khi làm việc với chuỗi nhiều dòng, dấu nháy lồng nhau hoặc ký tự Unicode.
Tại Sao Dùng Công Cụ Thoát Chuỗi Trực Tuyến?
Thêm hoặc xóa dấu gạch chéo ngược thủ công rất tẻ nhạt và dễ mắc lỗi, đặc biệt với dấu nháy lồng nhau hoặc đầu vào nhiều dòng. Công cụ thoát chuỗi trên trình duyệt cho kết quả ngay lập tức mà không cần cài đặt REPL hay viết script tạm thời.
⚡
Chuyển đổi tức thì
Dán văn bản và nhận kết quả đã thoát hoặc bỏ thoát ngay lập tức. Không cần mở terminal, khởi động REPL hay viết script dùng một lần.
🔀
Chuyển đổi giữa các định dạng
Chuyển đổi giữa các chế độ thoát JavaScript, Python và JSON. Mỗi ngôn ngữ xử lý dấu nháy đơn, Unicode và ký tự điều khiển khác nhau — công cụ tự động áp dụng đúng quy tắc.
🔒
Xử lý ưu tiên bảo mật
Toàn bộ quá trình thoát và bỏ thoát diễn ra trong trình duyệt của bạn bằng JavaScript. Chuỗi của bạn không bao giờ được gửi lên máy chủ, điều này quan trọng khi bạn làm việc với API key, token hoặc dữ liệu người dùng.
📋
Không cần đăng nhập hay cài đặt
Mở trang và bắt đầu dán. Không cần tạo tài khoản, không cần cài extension và không có màn hình đồng ý cookie nào chặn công cụ.
Các Trường Hợp Sử Dụng Thoát Chuỗi
Phát Triển Frontend
Thoát nội dung do người dùng tạo ra trước khi chèn vào thuộc tính HTML, script nội tuyến hoặc template literal. Ngăn chặn markup bị hỏng và các vector XSS từ dấu nháy hoặc dấu ngoặc góc chưa được thoát.
Tích Hợp API Backend
Xây dựng nội dung request JSON với các chuỗi nhúng chứa dòng mới, tab hoặc dấu nháy. Thoát đúng cách ngăn JSON bị lỗi định dạng gây ra lỗi 400 từ API nhận.
DevOps và Cấu Hình
Viết chuỗi đã thoát cho file config JSON, YAML heredoc hoặc biến môi trường. Một dấu gạch chéo ngược đặt nhầm trong Dockerfile ENV hoặc Kubernetes ConfigMap có thể làm hỏng quá trình triển khai.
QA và Dữ Liệu Kiểm Thử
Tạo chuỗi kiểm thử với ký tự điều khiển nhúng, chuỗi Unicode và dấu nháy lồng nhau. Các chuỗi trường hợp biên này cần thiết để xác minh rằng trình phân tích cú pháp và bộ tuần tự hóa xử lý đúng các ký tự đặc biệt.
Kỹ Thuật Dữ Liệu
Dọn dẹp dữ liệu bị thoát hai lần từ xuất CSV, bộ tổng hợp log hoặc dump cơ sở dữ liệu. Các trường đi qua nhiều lớp tuần tự hóa thường tích lũy thêm dấu gạch chéo ngược cần được loại bỏ.
Học Tập và Gỡ Lỗi
Kiểm tra cách các ngôn ngữ khác nhau biểu diễn cùng một chuỗi. Sinh viên và lập trình viên mới làm quen với một ngôn ngữ có thể so sánh thoát chuỗi JavaScript, Python và JSON song song để hiểu sự khác biệt.
Tham Chiếu Chuỗi Thoát
Bảng dưới đây liệt kê các chuỗi thoát phổ biến và liệu chúng có được hỗ trợ trong JavaScript, Python và JSON hay không. Cả ba ngôn ngữ chia sẻ tập hợp cốt lõi (dòng mới, tab, dấu gạch chéo ngược, dấu nháy kép), nhưng khác nhau về dấu nháy đơn, thoát hex và ký hiệu Unicode mở rộng.
Chuỗi
Ý nghĩa
JavaScript
Python
JSON
\n
Newline (LF)
Yes
Yes
Yes
\r
Carriage return
Yes
Yes
Yes
\t
Tab
Yes
Yes
Yes
\\
Backslash
Yes
Yes
Yes
\"
Double quote
Yes
Yes
Yes
\'
Single quote
Yes
Yes
No
\b
Backspace
Yes
Yes
Yes
\f
Form feed
Yes
Yes
Yes
\v
Vertical tab
Yes
Yes
No
\0
Null character
Yes
Yes
No
\xNN
Hex byte
Yes
Yes
No
\uNNNN
Unicode (BMP)
Yes
Yes
Yes
\u{N..}
Unicode (full)
Yes
No
No
JavaScript vs Python vs JSON: So Sánh Thoát Chuỗi
Mặc dù ba định dạng này chia sẻ cùng cú pháp dựa trên dấu gạch chéo ngược, chúng khác nhau về chuỗi nào hợp lệ và cách xử lý các trường hợp biên. Chọn sai chế độ tạo ra đầu ra trông đúng nhưng thất bại khi phân tích cú pháp.
JavaScript
Hỗ trợ thoát hex \x, \u{...} cho toàn bộ phạm vi Unicode (ngoài BMP), \v cho tab dọc và \0 cho null. Cả dấu nháy đơn và dấu nháy kép đều có thể được thoát. Template literal (backtick) tránh hầu hết nhu cầu thoát.
Python
Cùng các chuỗi cốt lõi như JavaScript, cộng thêm thoát hex \x và \N{name} cho ký tự Unicode có tên. Raw string (r"...") vô hiệu hóa hoàn toàn việc xử lý thoát. Cả dấu nháy đơn và dấu nháy kép đều có thể được thoát.
JSON
Định dạng hạn chế nhất. Chỉ \" (dấu nháy kép), \\, \/, \n, \r, \t, \b, \f và \uNNNN là hợp lệ. Không thoát dấu nháy đơn (chuỗi JSON luôn dùng dấu nháy kép). Không có thoát hex, không có \v, không có \0. Mọi ký tự điều khiển (U+0000 đến U+001F) phải dùng ký hiệu \uNNNN.
Ví Dụ Mã
Ví dụ thoát và bỏ thoát chuỗi trong JavaScript, Python, Go và dòng lệnh.
JavaScript
// Escape a string with special characters
const raw = 'Line 1\nLine 2\tTabbed "quoted"';
const escaped = JSON.stringify(raw);
// → '"Line 1\\nLine 2\\tTabbed \\"quoted\\""'
// Unescape a JSON string value
const input = '"Hello\\nWorld"';
const unescaped = JSON.parse(input);
// → "Hello\nWorld" (actual newline character)
// Template literals don't need quote escaping
const tpl = `She said "hello"`;
// → 'She said "hello"' — no backslashes needed
// Escape for use inside a RegExp
const query = 'price: $5.00 (USD)';
const safe = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
// → "price: \\$5\\.00 \\(USD\\)"
Python
# Escape with repr() — shows escape sequences
raw = "Line 1\nLine 2\t'quoted'"
print(repr(raw))
# → "Line 1\nLine 2\t'quoted'"
# Raw strings skip escape processing
path = r"C:\Users\name\Documents"
print(path)
# → C:\Users\name\Documents (backslashes kept literal)
# JSON escaping with json module
import json
data = 'He said "hello\nworld"'
escaped = json.dumps(data)
# → '"He said \\"hello\\nworld\\""'
# Unicode escaping
text = "Caf\u00e9" # → "Café"
print(text.encode('unicode_escape').decode())
# → "Caf\\xe9"
# Use $'...' syntax for escape sequences in bash
echo $'Line 1\nLine 2\tTabbed'
# → Line 1
# Line 2 Tabbed
# printf interprets escape sequences
printf 'Path: C:\\Users\\name\n'
# → Path: C:\Users\name
# Use jq to escape a string for JSON
echo 'He said "hello"' | jq -Rs .
# → "He said \"hello\"\n"
# Unescape JSON string with jq
echo '"Line 1\\nLine 2"' | jq -r .
# → Line 1
# Line 2
Câu Hỏi Thường Gặp
Sự khác biệt giữa thoát và mã hóa là gì?
Thoát thêm dấu gạch chéo ngược trước các ký tự đặc biệt trong chuỗi ký tự để trình phân tích ngôn ngữ coi chúng là dữ liệu, không phải cú pháp. Mã hóa chuyển đổi toàn bộ chuỗi sang biểu diễn khác — ví dụ, mã hóa Base64 chuyển đổi nhị phân sang văn bản ASCII, và mã hóa URL thay thế các ký tự không an toàn bằng chuỗi percent-hex. Thoát giữ nguyên khả năng đọc; mã hóa thay đổi hoàn toàn định dạng.
Tại sao chuỗi của tôi có dấu gạch chéo ngược kép (\\\\) thay vì đơn?
Dấu gạch chéo ngược kép xuất hiện khi chuỗi bị thoát hai lần. Điều này thường xảy ra khi dữ liệu đi qua nhiều lớp tuần tự hóa — ví dụ, một giá trị JSON được lưu trong một chuỗi JSON khác, hoặc một dòng log được mã hóa JSON trước khi ghi vào file. Để sửa, hãy bỏ thoát chuỗi từng lớp một cho đến khi đến được nội dung gốc.
Làm thế nào để thoát chuỗi cho JSON trong JavaScript?
Dùng JSON.stringify(). Nó bao chuỗi trong dấu nháy kép và thoát tất cả các ký tự mà JSON yêu cầu: dấu gạch chéo ngược, dấu nháy kép, dòng mới, tab và ký tự điều khiển dưới U+0020. Nếu bạn chỉ muốn nội dung bên trong mà không có dấu nháy bao quanh, dùng JSON.stringify(str).slice(1, -1).
Chuỗi JSON có thể chứa dấu nháy đơn không?
Không. Đặc tả JSON (RFC 8259) yêu cầu tất cả chuỗi phải được phân cách bằng dấu nháy kép. Dấu nháy đơn không phải là dấu phân cách chuỗi hợp lệ trong JSON. Mặc dù một số trình phân tích cú pháp dễ dãi có thể chấp nhận chúng, bất kỳ trình phân tích JSON tuân thủ tiêu chuẩn nào cũng sẽ từ chối chuỗi được bao bởi dấu nháy đơn. Nếu chuỗi của bạn chứa ký tự dấu nháy đơn, nó có thể xuất hiện nguyên văn bên trong JSON dùng dấu nháy kép — không cần thoát.
Raw string trong Python là gì?
Raw string (có tiền tố r, như r"C:\Users\name") yêu cầu trình thông dịch Python xử lý dấu gạch chéo ngược như ký tự thực sự thay vì dấu thoát. Điều này hữu ích cho đường dẫn file Windows, biểu thức chính quy và bất kỳ chuỗi nào cần giữ nguyên dấu gạch chéo ngược. Lưu ý rằng raw string không thể kết thúc bằng số lẻ dấu gạch chéo ngược, vì dấu gạch chéo ngược cuối sẽ thoát dấu nháy đóng.
Làm thế nào để thoát ký tự Unicode trong JavaScript?
JavaScript hỗ trợ hai dạng thoát Unicode. Cú pháp \uNNNN xử lý các ký tự trong Mặt Phẳng Đa Ngôn Ngữ Cơ Bản (U+0000 đến U+FFFF), chẳng hạn \u00e9 cho 'e có dấu sắc'. Đối với các ký tự ngoài BMP (emoji, chữ viết hiếm), dùng \u{NNNNN} với tối đa sáu chữ số hex — ví dụ, \u{1F600} cho emoji mặt cười toe toét. Dạng \u{'} được giới thiệu trong ES2015.
Thoát chuỗi có liên quan đến bảo mật (XSS, SQL injection) không?
Thoát cấp ngôn ngữ và thoát bảo mật phục vụ các mục đích khác nhau, nhưng ý tưởng là như nhau: ngăn các ký tự đặc biệt bị hiểu là mã. Để phòng ngừa XSS, bạn thoát các thực thể HTML (<, >, &). Đối với SQL injection, bạn dùng truy vấn tham số thay vì thoát thủ công. Công cụ này xử lý thoát chuỗi cấp ngôn ngữ (chuỗi dấu gạch chéo ngược), không phải thoát HTML hay SQL.