Đôi điều về hai bảng mã Unicode tiếng Việt

Chắc hẳn khi dùng các công cụ gõ văn bản tiếng Việt (TV), bạn đã từng nghe qua hai bộ mã TV Unicode: dựng sẵn và tổ hợp.

Để hiểu rõ hơn chúng ta hãy cùng xem xét ký tự TV có dấu đơn giản: “Ạ”. Để mã hóa ký tự này, với Unicode dựng sẵn, chúng ta dùng một ký tự có mã Unicode U+1EA0 với tên mô tả tiếng Anh: “LATIN CAPITAL LETTER A WITH DOT BELOW”. Cả chữ A và dấu nặng được dựng sẵn trong một tọa độ mã Unicode (code point). Còn với Unicode tổ hợp, bạn cần hai code point:

  • U+0041: LATIN CAPITAL LETTER A
  • U+0323: COMBINING DOT BELOW

Đoạn JavaScript sau sẽ minh họa thêm sự khác nhau giữa 2 cách viết:

unicode

Hiện nay, hầu như tất cả các phần mềm bộ gõ tiếng Việt đều sử dụng bộ mã dựng sẵn khi người dùng chọn bảng mã Unicode. Trong giao diện cài đặt Unikey cho Window, tại danh sách bảng mã sổ xuống, bạn sẽ thấy 2 lựa chọn: Unicode (ngầm hiểu là dựng sẵn) và Unicode tổ hợp.

Hai ứng dụng của String.prototype.normalize

Ứng dụng 1: So sánh chuỗi tiếng Việt

Như đã nói ở trên, văn bản tiếng Việt có thể được viết bằng hai bảng mã, và dù về mặt hiển thị ta thấy cùng một chuỗi, nhưng khi so sánh bằng code, hai chuỗi không bằng nhau ("Ạ" != "Ạ"). Do đó, sẽ có nhu cầu “chuẩn hóa” chuỗi văn bản tiếng Việt về một bảng mã thống nhất để dễ dàng so sánh.

Để chuẩn hóa chuỗi tiếng Việt trong ES6+, chúng ta chỉ cần gọi phương thức normalize của string như sau:

unicode

Như vậy, để so sách chuỗi tiếng Việt an toàn, chúng ta sẽ dùng normalize như ví dụ sau:

unicode

Xem thêm đặc tả của String.prototype.normalize tại MDN.

Ứng dụng 2: Gỡ bỏ dấu khỏi chuỗi tiếng Việt và chuyển thành slug

Trước đây, để bỏ dấu khỏi chuỗi tiếng Việt trong JS, chúng ta cần một bảng tra cứu tất cả các ký tự có dấu, như ví dụ sau:

unicode

Tuy nhiên với normalize, có một thủ thuật khá ngắn gọn để gỡ bỏ dấu tiếng việt mà không cần đến bảng tra cứu. Cơ chế của nó là bạn sẽ chuyển chuỗi tiếng việt thành định dạng tổ hợp với dấu là các ký tự rời. Các ký tự dấu rời nằm trong một dãy Unicode biết trước có tên Combining Diacritical Marks (\u0300-\u036f) nên chúng ta dễ dàng xóa chúng một cách tổng quát. Cuối cùng, ký tự “Đ” là một ký tự độc lập nên cần kiểm tra riêng trường hợp này:

unicode

Không phải tôi tự nghĩ ra giải pháp thú vị này, mà tôi đã tình cờ đọc được tweet này của Lea Verou. Và cũng nhờ nó mà lần đầu tiên tôi biết đến phương thức normalize.

Việc xóa dấu tiếng việt có nhiều mục đích, tuy nhiên phổ biến nhất có lẽ là để chuyển tiêu đề thành dạng slug để tạo URL cho trang web. Sau đây là đoạn CodePen hiện thực phương thức chuyển chuỗi slug tiếng Việt:

unicode

Trên đây là hai ứng dụng thú vị của String.prototype.normalize với tiếng Việt trong Unicode. Nếu bạn phát hiện ra thêm ứng dụng nào hay ho nữa hay có thắc mắc, hãy để lại comment bên dưới.

Hãy đón chờ những kiến thức khác trong các bài viết tiếp theo nhé ! Đồng thời Nordic Coder – Trung tâm dạy lập trình uy tín và chuyên nghiệp, luôn luôn mở các lớp học đào tạo cho người mới bắt đầu, hãy nhanh tay đăng ký tham gia nào các bạn ơi.

Tác giả: Giảng viên NC- Trần Trọng Thanh

Nguồn: int3ractive.com