Tất cả bài viết

Text Reverse: vì sao "đảo ngược văn bản" khó hơn tưởng tượng

"Đảo ngược văn bản" nghe có vẻ là thao tác đơn giản nhất có thể — chỉ cần xuất các ký tự theo thứ tự ngược lại. Nhưng với tiếng Việt, mọi chuyện phức tạp hơn nhiều so với tiếng Anh, vì bản thân cách mã hóa chữ có dấu đã tiềm ẩn một cái bẫy phổ biến.

NFC và NFD — cùng một chữ, hai cách mã hóa

Chữ "ệ" có thể được lưu theo hai cách trong Unicode: dạng dựng sẵn NFC (một mã điểm duy nhất) hoặc dạng phân rã NFD (chữ cái gốc "e" cộng thêm hai dấu kết hợp riêng biệt cho mũ và nặng, đi ngay sau nó). Nhiều hệ thống — đặc biệt là văn bản gõ trên macOS hoặc xử lý qua một số bộ gõ — lưu chữ tiếng Việt ở dạng NFD. Nếu đảo ngược chuỗi NFD theo từng mã điểm, các dấu kết hợp bị tách khỏi chữ cái gốc và gắn nhầm sang chữ cái bên cạnh, biến "Việt" thành một chuỗi ký tự lộn xộn không còn nghĩa.

Cụm grapheme là gì

Cái mà con người xem là "một ký tự nhìn thấy được" đôi khi trong Unicode lại gồm nhiều mã điểm ghép lại — một chữ cái tiếng Việt ở dạng NFD, hay một emoji gia đình (👨‍👩‍👧) được nối bằng ký tự nối độ rộng bằng không, đều là ví dụ. Tổ hợp như vậy gọi là cụm grapheme.

Cách đảo ngược đúng

Cách làm đúng là trước tiên chuẩn hóa chuỗi về dạng NFC (gộp dấu vào chữ cái gốc thành một mã điểm) hoặc tách chuỗi thành các cụm grapheme hoàn chỉnh, rồi mới đảo ngược thứ tự của các cụm đó — chứ không đảo ngược từng mã điểm rời rạc bên trong.

Dùng để làm gì

  • Kiểm tra chuỗi đối xứng (palindrome) hoặc tạo hiệu ứng văn bản "phản chiếu".
  • Minh họa hoặc chẩn đoán lỗi xử lý Unicode trong code.
  • Các bài tập giải trí hoặc học tập cần đảo ngược đúng văn bản có dấu tiếng Việt hoặc emoji.
Dùng thử công cụ