Mình dành bài cuối cùng này để nói về yêu cầu số 1 nêu trên, một yêu cầu thuần túy thực tiễn, bỏ qua 4 yêu cầu còn lại vốn mang nặng tính kỹ thuật (lý thuyết).
Cấu hình phép so sánh xâu của thư viện ICU ở phần đặc thù cho tiếng Việt, xem ra là đúng, nhưng thuật toán UCA mà nó thực thi thì dường như là sai. UCA áp dụng mọi cấp ưu tiên ở phạm vi toàn xâu, trong khi từ điển VN áp dụng 2 cấp ưu tiên cao nhất, cấp 1 (chữ cái) và cấp 2 (dấu thanh) ở phạm vi từng chữ.
Đơn cử, khi so sánh nguyện cầu với nguyền rủa, UCA đã đem so sánh nguyên câu với nguyên rua ở cấp 1 và định đoạt kết quả nguyện cầu < nguyền rủa ngay ở cấp 1; còn từ điển thì trước hết so sánh hai chữ đầu nguyện với nguyền, nghĩa là ở cấp 1 so sánh nguyên với nguyên và, do cấp 1 bất phân, cấp 2 so sánh nặng với huyền, và quyết định kết quả ngay ở chữ đầu, ngược với UCA, là nguyện cầu > nguyền rủa.
Vấn đề trên gợi ra 2 câu hỏi.
1. Vì sao UCA so sánh toàn xâu hơn là so sánh theo từng chữ (từ)?
2. Thư viện ICU được sử dụng rộng rãi trong các chương trình xử lý dữ liệu, hệ thống thông tin, hệ thống quản trị CSDL và thậm chí các hệ điều hành. Vì sao lỗi sơ đẳng như thế mà không ai nhìn thấy?
Mình giải đáp 2 câu hỏi này dựa theo phán đoán chủ quan.
Ad 1. Theo [Wikipedia, bài "Alphabetical order", đoạn "Ordering in the Latin script", mục "Treatment of multiword strings"], đối với các xâu nhiều từ, có 2 cách so sánh. Một là theo từng từ (so sánh từ với từ), hai là theo từng chữ cái (so sánh chữ cái với chữ cái) sau khi đã nối các từ với nhau làm 1. Cách thứ hai thường dùng trong từ điển, cách thứ nhất thường dùng trong chỉ mục (ở cuối một quyển sách). Xin bổ sung, cách thứ nhất cũng được dùng trong từ điển bách khoa. Sở dĩ thế là vì trong từ điển, mỗi mục từ thường chỉ gồm 1 từ còn trong chỉ mục (hay từ điển bách khoa) mỗi mục từ thường là một chuỗi 2 - 3 từ. Vì từ điển thông dụng hơn chỉ mục (hay từ điển bách khoa), nên UCA đã theo cách này.
Xin nhấn mạnh là cách thứ hai dùng trong từ điển của các thứ tiếng phương Tây, còn từ điển tiếng Việt (hay Việt-Anh, Việt-Pháp, v.v.) thì theo cách thứ nhất. Sở dĩ thế là vì mỗi từ Việt thường là một chuỗi nhiều chữ mà một chữ Việt lại trông giống như một từ của các thứ tiếng phương Tây. Cũng vì thế, cách này áp dụng cho tiếng Việt trở thành so sánh theo từng chữ.
Ad 2. Hãy xem một mảng thông dụng nhất, hệ thống thông tin. Phép so sánh có 2 công dụng. Một là tìm kiếm (bao gồm cả lập chỉ mục) thông tin, hai là trình bày (hiển thị) kết quả.
Cho việc tìm kiếm, so sánh sai không nhất thiết cho kết quả sai. Chẳng hạn, tuy khó < khoa, nhưng kể cả khi phép so sánh sai (khoa < khó), nếu người dùng tìm đích danh khoa, rất có thể sẽ tìm thấy. Kết quả chỉ sai (không tìm thấy khoa trong CSDL) nếu người dùng tìm kiếm bằng cách chỉ ra một khoảng giới hạn, chẳng hạn, khoảng [khó,khôn]. Trên các giao diện người dùng, tìm kiếm bằng khoảng tường minh thường chỉ áp dụng cho dữ liệu dạng số (kể cả xâu số, như năm-tháng-ngày, giờ-phút-giây, số hộ chiếu, số điện thoại, số tài khoản) chứ ít khi được áp dụng cho dữ liệu dạng chữ. Đối với chữ, tìm kiếm đích danh thống trị.
Cho việc trình bày, so sánh sai cũng không nhất thiết cho kết quả sai. Chúng ta thường hiển thị danh mục hàng hóa/sản phẩm hay danh mục tài khoản kế toán sắp thứ tự theo mã số hơn là theo tên. Danh bạ là thứ dữ liệu thông dụng duy nhất thường được hiển thị sắp xếp theo tên. Nên hãy xem thí dụ tiêu biểu, sắp xếp một danh sách người Việt theo tên và họ:
- Sắp xếp theo tên không thể sai, vì tên chỉ có 1 chữ.
- Sắp xếp theo họ (khi trùng tên) ít khi sai, vì họ thường ngắn và đơn giản. Nói rõ hơn, do có rất ít họ (và nói chung, rất ít chữ thường dùng trong các họ) nên khả năng 2 chữ ở cùng vị trí trong 2 xâu so sánh chỉ sai khác ở dấu thanh là rất ít. Thí dụ, do chỉ có họ Nguyễn chứ không có họ Nguyên, Nguyền, Nguyển, Nguyến, Nguyện, bất cứ phép so sánh 2 xâu nào bắt đầu bằng Nguyễn cũng đều đã chắc chắn đúng ở chữ đầu tiên và, do thế, hầu như chắc chắn đúng ở kết quả cuối cùng; nếu thêm vào đó, ít nhất 1 trong 2 xâu này chỉ có 1 chữ Nguyễn, thì không còn "hầu như" gì nữa, mà là tuyệt đối.
Những kết quả sai, như Nguyễn Lệ Hằng Nga < Nguyễn Lê Hồng Nga, Nguyễn Lý Huệ Trang < Nguyễn Ly Hương Trang, Nguyễn Thúy Mi Anh < Nguyễn Thùy Mỵ Anh, Nguyễn Vẫn Đô Con < Nguyễn Vân Đồn Con, Nguyễn Tự Nguyện Hy Sinh < Nguyễn Tự Nguyễn Vô Sinh hay Nguyễn Tù Mười Năm Chửa Xong À Cơ < Nguyễn Tu Mươi Năm Chưa Yong À Cơ, là rất hiếm thấy. Càng hiếm thấy hơn khi xét rằng danh sách mà chúng ta hiển thị thường chỉ có chừng 100 người hơn là 100 triệu người.