Trong thực tế việc sắp xếp tiếng Việt dựa trên chủ ý của người lập trình hay tiện ích. Thường cách sắp xếp thứ tự tiếng Việt theo các ký tự từ trái sang phải. Ví dụ, với các chữ Bang, Bách, Bắc, Bằng - theo cách sắp thứ tự thông thường (từ trái sang phải) thì sắp B (ngang nhau), kế đến là a, á, ắ, ằ, sau đó là n, c... Và cứ thế cuối cùng thứ tự sắp sẽ là: Bang, Bách, Bằng, Bắc....
Nội dung trích xuất từ tài liệu:
Sắp xếp tiếng Việt theo vầnSắp xếp tiếng Việt theo vầnrong thực tế việc sắp xếp tiếng Việt dựa trên chủ ýcủa người lập trình hay tiện ích. Thường cách sắp xếpthứ tự tiếng Việt theo các ký tự từ trái sang phải. Vídụ, với các chữ Bang, Bách, Bắc, Bằng - theo cáchsắp thứ tự thông thường (từ trái sang phải) thì sắp B(ngang nhau), kế đến là a, á, ắ, ằ, sau đó là n, c... Vàcứ thế cuối cùng thứ tự sắp sẽ là: Bang, Bách, Bằng,Bắc.Trình tự sắp xếp như trên không đúng thứ tự vầntiếng Việt. Thứ tự đúng theo vần phải là: Bách, Bắc,Bang, Bằng - có nghĩa là bỏ sắp dấu sau cùng.Trước đây tác giả cũng đã nhầm về vấn đề này (Xembài Sắp xếp tiếng Việt Unicode trong MS Access -TGVT A tháng 12/2004, t.140), và rất nhiều chươngtrình và tiện ích khác cũng thực hiện cách sắp theo kýtự từ trái sang phải.Qua quá trình tìm hiểu tôi đã tìm ra một cách có thểgiải quyết vấn đề này. Cách này sử dụng với fontUnicode, nên xem lại bài viết Sắp xếp tiếng ViệtUnicode trong MS Access. Trong một bài viết có đềcập tới hai hàm Mahoa và Daonguoc, ở đây tôi thaybằng hai hàm Chuanhoa và Mahoa.Bước 1: Chuẩn bịĐặt hai Textbox lên form:➢ Textbox1 đặt tên là TextGockdau, nhập trực tiếpchuỗi ký tự Việt Unicode sau (có thể nhập trongWord và copy sang):AaĂăÂâBbCcDdĐđEeÊêFfGgHhIiJjKkLlMmNnOoÔôƠơPpQqRrSsTtUuƯưVvWwXxYyZz➢ Textbox2 đặt tên là TextGocCdau, nhập trực tiếpchuỗi ký tự Việt Unicode sau:AÀẢÃÁẠĂẰẲẴẮẶÂẦẨẪẤẬEÈẺẼÉẸÊỀỂỄẾỆIÌỈĨÍỊOÒỎÕÓỌÔỒỔỖỐỘƠỜỞỠỚỢUÙỦŨÚỤƯỪỬỮỨỰYỲỶỸÝỴaàảãáạăằẳẵắặâầẩẫấậeèẻẽéẹêềểễếệiìỉĩíịoòỏõóọôồổỗốộơờởỡớợuùủũúụưừửữứựyỳỷỹýỵSau đó xuất thành file ForChuama.frm. Thực ra tôimuốn giấu form này trong giao diện thiết kế củaAccess, các bạn có thể dùng một form tạm để chứahai chuỗi trên.Bước 2: Tiến hành như bài viết Sắp xếp tiếng ViệtUnicode trong MS Access. Bước 3: Bước này quyết địnhviệc sắp xếp theo vần. Việc giải quyết dựa trên hàmChuanhoa, hàm Mahoa có tác dụng đảo ngược chuỗihọ tên đồng thời gọi hàm Chuanhoa để chuẩn hoáchuỗi họ tên đó.Private Function Chuanhoa(CChuanma As String) AsStringDim Kq, kti As StringDim vt1, vt2, i As IntegerDim CgocKdau, Cma1 As String, CgocCdau, xd,Cma2 As StringCgocCdau = ForChuama.TextGocCdau.TextCma1 =aaacaeaoaqaybkbmbocaccckabadafaparazblbnbpcbcdcl1b1c1d1e1f1aCgocKdau = ForChuama.TextGockdau.TextCma2 =aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayazbabbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzcacbcccdcecfcgchcicjckclcmcnKq = xd = For i = 1 To Len(CChuanma)kti = Mid(CChuanma, i, 1)vt1 = InStr(CgocCdau, kti)If vt1 0 Then Nếu ký tự có dấuKq = Kq & Mid(Cma1, 1 + ((vt1 - 1) 6) * 2, 2)Chuẩn hoá phần ký tựxd = xd & Mid(Cma1, 49 + ((4 + vt1) Mod 6) * 2, 2) Chuẩn hoá phần dấuElsevt2 = InStr(CgocKdau, kti)If vt2 0 ThenKq = Kq & Mid(Cma2, vt2 * 2 - 1, 2)ElseKq = Kq + ktiEnd IfEnd IfNext iChuanhoa = Kq & xdEnd FunctionPublic Function Mahoa(ChuoiHoten As String) AsStringDim vt1 As IntegerDim Kq As String, Ctam As StringChuoiHoten = Trim(ChuoiHoten) & Kq = vt1 = InStr(ChuoiHoten, )Do While vt1 0Ctam = Trim(Left(ChuoiHoten, vt1 - 1))ChuoiHoten = Right(ChuoiHoten, Len(ChuoiHoten) -vt1)Kq = Chuanhoa(Ctam) & & Kqvt1 = InStr(ChuoiHoten, )LoopMahoa = KqEnd FunctionỞ đây tôi đã sử dụng quy luật dấu (có 6 dấu) theo thứtự: không, huyền, hỏi, ngã, sắc, nặng.Ví dụ: A À Ả à Á ẠTrong hàm Chuanhoa tôi đã sử dụng quy luật này đểcắt dấu một ký tự có dấu rồi chuẩn hoá phần ký tựvới câu lệnh:Kq = Kq & Mid(Cma1, 1 + ((vt1 - 1) 6) * 2, 2)đồng thời chuẩn hóa phần dấu:xd = xd & Mid(Cma1, 49 + ((4 + vt1) Mod 6) * 2, 2)theo PCWorld