Ký tự vô hình

Tên gọi chung cho các ký tự tồn tại trong dữ liệu văn bản nhưng không hiển thị trên màn hình. Bao gồm khoảng trắng độ rộng không, ký tự điều khiển hai chiều, dấu gạch nối mềm, và ảnh hưởng đến kết quả đếm ký tự.

Ký tự vô hình (invisible character) là tên gọi chung cho các ký tự tồn tại trong văn bản nhưng không có biểu hiện trực quan trên màn hình. Khác với ký tự điều khiển (xuống dòng, tab), nhiều ký tự vô hình hoạt động như "chỉ thị ẩn" ảnh hưởng đến cách hiển thị và xử lý văn bản. Trong đếm ký tự, ký tự vô hình là một trong những bẫy khó phát hiện nhất.

Unicode định nghĩa nhiều ký tự vô hình. Khoảng trắng độ rộng không (U+200B) là khoảng trắng không có chiều rộng, được chèn vào giữa từ dài để đánh dấu vị trí có thể ngắt dòng. Ký tự nối độ rộng không (ZWJ, U+200D) kết hợp các ký tự liền kề, được dùng trong tổ hợp emoji (👨+ZWJ+👩+ZWJ+👧 = 👨‍👩‍👧). Ký tự chống nối độ rộng không (ZWNJ, U+200C) ngăn việc kết hợp, dùng trong tiếng Ả Rập và tiếng Ba Tư để kiểm soát liên kết chữ cái.

Ký tự điều khiển hai chiều (bidirectional) cũng là một loại ký tự vô hình. Dấu trái-sang-phải (LRM, U+200E) và dấu phải-sang-trái (RLM, U+200F) kiểm soát hướng viết khi văn bản tiếng Ả Rập hoặc tiếng Hebrew trộn lẫn với tiếng Anh. Các ký tự này không nhìn thấy nhưng ảnh hưởng lớn đến thứ tự hiển thị văn bản.

Ảnh hưởng của ký tự vô hình đến đếm ký tự rất nghiêm trọng. Khi sao chép văn bản từ trang web, khoảng trắng độ rộng không hoặc ký tự điều khiển hai chiều có thể lẫn vào. Nếu cùng một văn bản nhìn giống hệt nhau nhưng công cụ đếm ký tự cho kết quả khác nhau, hãy nghi ngờ có ký tự vô hình. Ví dụ, "Xin chào" đếm được 9 ký tự thay vì 8, có thể do khoảng trắng độ rộng không được chèn giữa hai từ. Với văn bản tiếng Việt, vấn đề này đặc biệt phổ biến khi sao chép từ các tài liệu cũ sử dụng bảng mã TCVN.

Về bảo mật, ký tự vô hình có thể bị lợi dụng cho tấn công. Năm 2021, cuộc tấn công "Trojan Source" được công bố: chèn ký tự điều khiển hai chiều vào mã nguồn khiến code hiển thị bình thường nhưng thực thi logic khác. Chèn ký tự độ rộng không vào tên người dùng hoặc mật khẩu để tạo chuỗi trông giống nhau nhưng thực chất khác nhau cũng là kỹ thuật đã biết.

Để đối phó, nên thực hiện sanitize (loại bỏ ký tự vô hình không cần thiết) trước khi xử lý văn bản. Biểu thức chính quy /[\u200B-\u200F\u2028-\u202F\u2060-\u206F\uFEFF]/g có thể phát hiện và loại bỏ các ký tự vô hình chính. Tuy nhiên, ZWJ cần thiết cho tổ hợp emoji nên không thể loại bỏ toàn bộ. Cần loại bỏ có chọn lọc tùy theo mục đích sử dụng.

Chia sẻ bài viết này