Ký tự ẩn là những ký tự Unicode không vẽ ra hình gì trên màn hình, hoặc trông hệt dấu cách thường, nhưng vẫn nằm trong văn bản và vẫn bị đếm. Chúng theo văn bản đi vào máy bạn mỗi lần sao chép từ trang web, file PDF hay bảng tính.
Các loại ký tự ẩn hay gặp
Bốn nhóm sau chiếm phần lớn trường hợp trong văn bản tiếng Việt.
| Ký tự | Mã | Dấu hiệu |
|---|---|---|
| Zero-width space | U+200B | Không thấy gì, nhưng con trỏ phải bấm thêm một nhịp mới qua |
| Dấu cách không ngắt (NBSP) | U+00A0 | Giống dấu cách, thường dính theo khi dán từ web hoặc Excel |
| Dấu thứ tự byte (BOM) | U+FEFF | Nằm ngay đầu file .txt hoặc .csv xuất từ phần mềm |
| Gạch nối mềm | U+00AD | Chỉ hiện thành gạch ngang khi chữ bị ngắt cuối dòng |
Ngoài bốn nhóm này còn có dấu điều hướng chữ, ký tự điều khiển và các khoảng trắng Unicode rộng hẹp khác nhau.
Ký tự ẩn gây ra lỗi gì
Hậu quả thường thấy là số liệu lệch và phép so khớp trượt.
Một tin nhắn tưởng chỉ có chữ không dấu nhưng dính dấu cách không ngắt sẽ nhảy sang bảng mã UCS-2, mỗi tin chỉ còn 70 ký tự. Hàm tìm kiếm trong Excel không khớp hai ô nhìn giống hệt nhau. Số ký tự khai báo cho một trường bị vượt mà nhìn mắt thường không hiểu vì sao. Tôi luôn chạy một lượt soát ký tự ẩn trước khi dán nội dung vào biểu mẫu có giới hạn cứng.
Công cụ phát hiện ký tự ẩn
Ba công cụ sau chỉ ra vị trí và xoá giúp bạn.
- Tìm ký tự ẩn liệt kê từng ký tự, mã Unicode, vị trí và cho xoá hàng loạt.
- Xoá khoảng trắng thừa gộp dấu cách lặp và bỏ khoảng trắng đầu cuối dòng.
- Đếm ký tự SMS cho biết ký tự nào đang đẩy tin sang bảng mã đắt hơn.
- Đếm byte UTF-8 so số ký tự nhìn thấy với số byte thật của chuỗi.