Tải bản đầy đủ (.pdf) (10 trang)

Sắp xếp tiếng Việt theo vần

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (216.82 KB, 10 trang )

Sắp xếp tiếng Việt theo vần
rong 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.

Trình tự sắp xếp như trên không đúng thứ tự vần
tiế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 (Xem
bà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ương


trì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 font
Unicode, nên xem lại bài viết 'Sắp xếp tiếng Việt
Unicode trong MS Access'. Trong một bài viết có đề
cập tới hai hàm Mahoa và Daonguoc, ở đây tôi thay
bằ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ếp
chuỗi ký tự Việt Unicode sau (có thể nhập trong
Word và copy sang):
'AaĂăÂâBbCcDdĐđEeÊêFfGgHhIiJjKkLlMmNnOo


ÔôƠơPpQqRrSsTtU
uƯưVvWwXxYyZz'
➢ Textbox2 đặt tên là TextGocCdau, nhập trực tiếp
chuỗi ký tự Việt Unicode sau:
'ẦẢÃÁẠĂẰẲẴẮẶÂẦẨẪẤẬẺẼÉẸÊỀỂỄẾỆIÌỈ
ĨÍỊỎÕĨỌƠỒỔỖỐỘ
ƠỜỞỠỚỢÚỦŨÚỤƯỪỬỮỨỰYỲỶỸÝỴầảãáạăằ
ẳẵắặâầẩẫấậẻẽ
éẹêềểễếệiìỉĩíịỏõóọơồổỗốộơờởỡớợúủũúụưừửữứựy
ỳỷỹýỵ'

Sau đó xuất thành file ForChuama.frm. Thực ra tôi
muốn giấu form này trong giao diện thiết kế của
Access, các bạn có thể dùng một form tạm để chứa
hai chuỗi trên.

Bước 2: Tiến hành như bài viết 'Sắp xếp tiếng Việt


Unicode trong MS Access'.

Bước 3: Bước này quyết định
việc sắp xếp theo vần. Việc giải quyết dựa trên hàm
Chuanhoa, hàm Mahoa có tác dụng đảo ngược chuỗi

họ tên đồng thời gọi hàm Chuanhoa để chuẩn hố
chuỗi họ tên đó.

Private Function Chuanhoa(CChuanma As String) As
String

Dim Kq, kti As String

Dim vt1, vt2, i As Integer


Dim CgocKdau, Cma1 As String, CgocCdau, xd,
Cma2 As String

CgocCdau = ForChuama.TextGocCdau.Text

Cma1 =
'aaacaeaoaqaybkbmbocaccckabadafaparazblbnbpcb
cdcl1b1c1d1e1f1a'

CgocKdau = ForChuama.TextGockdau.Text

Cma2 =
'aaabacadaeafagahaiajakalamanaoapaqarasatauavawa
xayaz
babbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvb
wbxbybzcacbcc
cdcecfcgchcicjckclcmcn'



Kq = ''

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ấu

Kq = 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ấu

Else


vt2 = InStr(CgocKdau, kti)

If vt2 <> 0 Then

Kq = Kq & Mid(Cma2, vt2 * 2 - 1, 2)

Else

Kq = Kq + kti


End If

End If

Next i

Chuanhoa = Kq & xd


End Function

Public Function Mahoa(ChuoiHoten As String) As
String

Dim vt1 As Integer

Dim Kq As String, Ctam As String

ChuoiHoten = Trim(ChuoiHoten) & ' '

Kq = ''

vt1 = InStr(ChuoiHoten, ' ')

Do While vt1 <> 0

Ctam = Trim(Left(ChuoiHoten, vt1 - 1))



ChuoiHoten = Right(ChuoiHoten, Len(ChuoiHoten) vt1)

Kq = Chuanhoa(Ctam) & ' ' & Kq

vt1 = InStr(ChuoiHoten, ' ')

Loop

Mahoa = Kq

End 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 hố 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




×