Dò Ký Tự Ẩn
Văn bản chép từ website, PDF, Word hay từ chat AI thường mang theo ký tự Unicode vô hình. Bạn không nhìn thấy chúng, nhưng chúng làm hỏng phép so sánh chuỗi, git diff, tìm kiếm, import CSV, khoá JSON và ô mật khẩu. Công cụ này tìm ra tất cả và giúp bạn dọn sạch.
Phát hiện được những gì
- Zero-width — Zero Width Space (U+200B), ZWNJ, ZWJ, Word Joiner, BOM (U+FEFF), Hangul Filler, toán tử toán học vô hình.
- Giả khoảng trắng — No-Break Space (U+00A0), Narrow NBSP, Thin/Hair/En/Em space, Ideographic Space (U+3000).
- Điều khiển bidi — LRM, RLM, LRO, RLO, isolate. Chúng có thể đảo thứ tự hiển thị của văn bản — chiêu "trojan source" kinh điển.
- Điều khiển — các ký tự điều khiển C0 từ U+0000 đến U+001F (NUL, BEL, BS, ESC và các ký tự còn lại), DEL (U+007F) và các ký tự điều khiển C1 từ U+0080 đến U+009F (NEL, CSI…), mỗi ký tự hiện kèm tên viết tắt và tên đầy đủ; thêm Soft Hyphen và Line/Paragraph Separator.
- Khác — Variation Selector, ký tự Unicode Tag, Replacement Character (U+FFFD).
Tab, xuống dòng (LF) và về đầu dòng (CR) cũng là ký tự điều khiển C0, nhưng gần như văn bản nào cũng có, nên chúng chỉ được báo khi bật Báo cả tab và xuống dòng.
Các bước
- Dán văn bản vào ô nhập.
- Nếu tìm thấy, bạn sẽ thấy số lượng và một bản xem trước trong đó mỗi ký tự vô hình được thay bằng nhãn màu
U+XXXX, nhờ vậy biết chính xác nó nằm ở đâu. - Đọc bảng thống kê chi tiết: mã ký tự, tên chính thức, loại và số lần xuất hiện.
- Chọn Chuẩn hoá (đổi các loại khoảng trắng lạ thành space thường, xoá phần còn lại) hoặc Xoá hết, rồi chép văn bản đã sạch.
Mẹo
- Chuẩn hoá là lựa chọn an toàn cho văn bản thường vì vẫn giữ ranh giới từ. Xoá hết phù hợp cho định danh, khoá và mật khẩu.
- U+FEFF ở vị trí 0 chính là BOM. Đây là lý do phổ biến nhất khiến file JSON hoặc CSV lỗi parse ngay ký tự đầu tiên.
- Văn bản dán từ công cụ AI rất hay chứa U+00A0 thay cho space thường, âm thầm làm hỏng thụt lề code và phép so sánh
===. - Dấu bidi override (U+202E và họ hàng) xuất hiện trong mã nguồn luôn cần bị coi là đáng ngờ.
- Gặp ESC (U+001B) thường là do mã màu của terminal bị chép theo cùng kết quả dòng lệnh; gặp NUL (U+0000) thường là một phần file nhị phân đã lọt vào văn bản.
- Khi chuẩn hoá, tab dọc, form feed và NEL thành dấu xuống dòng; tab (nếu được báo) thành dấu cách, và cặp CRLF thành một lần xuống dòng. Mọi ký tự điều khiển khác bị xoá.
Câu hỏi thường gặp
Vì sao hai chuỗi nhìn giống hệt nhau mà không bằng nhau?
Gần như luôn là do zero-width space hoặc non-breaking space. Hãy đưa cả hai chuỗi qua công cụ này và so số lượng.
Nó có làm thay đổi phần chữ nhìn thấy được không?
Không. Chỉ những ký tự liệt kê trong bảng thống kê mới bị xoá hoặc thay thế; mọi ký tự hiển thị được đều giữ nguyên.
Vì sao các dấu xuống dòng của tôi không được liệt kê?
Chúng là bố cục bình thường chứ không phải ký tự rác ẩn. Bật Báo cả tab và xuống dòng để đếm cả chúng — khi đó Xoá hết cũng sẽ nối các dòng lại với nhau.
Văn bản của tôi có bị tải lên không?
Không — toàn bộ quá trình quét chạy ngay trên trình duyệt.