Sắp xếp (Sort)

Quá trình sắp xếp chuỗi ký tự theo thứ tự nhất định (thứ tự từ điển, thứ tự Unicode, thứ tự phụ thuộc locale, v.v.). "Thứ tự đúng" khác nhau tùy ngôn ngữ và văn hóa, nên cài đặt collation rất quan trọng trong quốc tế hóa.

Sắp xếp (sort) là quá trình xếp danh sách chuỗi ký tự theo một thứ tự nhất định. Danh sách tệp, danh bạ, mục từ điển, kết quả tìm kiếm - mọi nơi xử lý dữ liệu văn bản đều cần sắp xếp. Tuy nhiên, "thứ tự đúng" khác nhau tùy ngôn ngữ và văn hóa, nên sắp xếp quốc tế hóa phức tạp hơn vẻ bề ngoài rất nhiều.

Cách sắp xếp đơn giản nhất là theo thứ tự code point Unicode. Hàm Array.sort() mặc định của JavaScript sử dụng phương pháp này. Tuy nhiên, theo code point, "Z" (U+005A) đứng trước "a" (U+0061), nên danh sách trộn lẫn chữ hoa và chữ thường cho kết quả phản trực giác. Chuỗi số cũng được sắp xếp theo thứ tự từ điển: "1, 10, 2, 20, 3" thay vì thứ tự số.

Sắp xếp tiếng Việt có những thách thức đặc thù. Bảng chữ cái tiếng Việt có 29 chữ cái, trong đó các chữ có dấu phụ (ă, â, đ, ê, ô, ơ, ư) cần được xếp đúng vị trí: "ă" sau "a", "â" sau "ă", "đ" sau "d". Ngoài ra, thứ tự dấu thanh cũng cần tuân theo quy tắc: ngang, huyền, sắc, hỏi, ngã, nặng. Sắp xếp theo code point Unicode không cho kết quả đúng vì "đ" (U+0111) có code point xa "d" (U+0064).

Thư viện ICU (International Components for Unicode) là tiêu chuẩn ngành cho sắp xếp phụ thuộc locale. Intl.Collator trong JavaScript dựa trên ICU, cho phép sắp xếp theo thứ tự tự nhiên của từng ngôn ngữ. Với tiếng Việt: new Intl.Collator('vi').compare(a, b) sẽ xếp "đ" đúng sau "d" và xử lý dấu thanh chính xác. Đây là cách tiếp cận được khuyến nghị thay vì tự viết logic so sánh.

Sắp xếp tự nhiên (natural sort) là phương pháp diễn giải số trong chuỗi như giá trị số. Sắp xếp từ điển cho "file1, file10, file2", nhưng sắp xếp tự nhiên cho "file1, file2, file10" theo thứ tự số. Phương pháp này hữu ích khi sắp xếp tên tệp hoặc số phiên bản để có kết quả trực quan.

Liên quan đến đếm ký tự, việc tạo khóa sắp xếp đôi khi yêu cầu chuẩn hóa chuỗi. Thống nhất có dấu/không dấu, chữ hoa/chữ thường - các bước tiền xử lý trước khi sắp xếp có thể thay đổi số ký tự. Ví dụ, chuyển "Hà Nội" thành "ha noi" để sắp xếp sẽ giảm số ký tự. Kết quả hiển thị nên dùng chuỗi gốc (trước chuyển đổi), khóa sắp xếp (sau chuyển đổi) chỉ dùng cho xử lý nội bộ.

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