• Thứ Tư, 18/04/2007 09:05 (GMT+7)

    Viết chương trình VB đếm tổng số ký tự chuỗi tiếng Việt

    Câu hỏi :

    Xin hướng dẫn viết chương trình VB đếm tổng số ký tự chuỗi tiếng Việt sử dụng mã VNI, đếm cả khoảng trắng nhưng bỏ qua dấu tiếng Việt.



    Trả lời :

    Mã VNI for Windows là mã tiếng Việt 2 byte, nghĩa là 1 ký tự có dấu tiếng Việt được tạo thành bởi 2 byte: byte miêu tả nguyên âm và byte miêu tả dấu. Nghiên cứu bảng mã VNI ta thấy có 36 mã sau là các mã dấu: &HC0-&HC5, &HC8-&HCB, &HCF, &HD5, &HD8-&HDC, &HE0-&HE5, &HE8-&HEB, &HEF, &HF5, &HF8-&HFC (các giá trị mã được miêu tả ở hệ thống số thập lục phân và bằng cú pháp của ngôn ngữ VB). Một trong các phương pháp đếm số lượng ký tự trong chuỗi VNI là xây dựng bảng miêu tả độ dài từng mã ký tự, bản này có 256 phần tử, các phần tử của bảng đều có độ dài là 1 trừ 36 phần tử miêu tả dấu có độ dài là 0. Cụ thể hàm đếm số ký tự VNI được viết như sau:

     'định nghĩa bảng miêu tả độ dài từng ký tự
     Dim LenOfChar(0 To 255) As Byte
     'thủ tục khởi động nội dung của bảng LenOfChar
     'phải gọi thủ tục này 1 lần trước khi dùng hàm VNILen dưới đây
     Sub InitLenOfChar()
     'lúc đầu tất cả ký tự đều có độ dài là 1
     For i = 0 To 255
     LenOfChar(i) = 1
     Next i
     'hiệu chỉnh độ dài 0 cho 36 ký tự dấu
     For i = &HC0 To &HC5
     LenOfChar(i) = 0
     LenOfChar(i + 32) = 0
     Next i
     For i = &HC8 To &HCB
     LenOfChar(i) = 0
     LenOfChar(i + 32) = 0
     Next i
     LenOfChar(&HCF) = 0
     LenOfChar(&HD5) = 0
     LenOfChar(&HCF + 32) = 0
     LenOfChar(&HD5 + 32) = 0
     For i = &HD8 To &HDC
     LenOfChar(i) = 0
     LenOfChar(i + 32) = 0
     Next i
     End Sub
     
     'hàm VNILen tính độ dài chuỗi tiếng Việt VNI
     Private Function VNILen(s As String) As Integer
     Dim buf() As Byte
     Dim slen As Integer
     slen = 0
     'chuyển chuỗi s về dạng ANSI
     buf = StrConv(s, vbFromUnicode)
     'cộng dồn độ dài từng ký tự trong chuỗi
     For i = 0 To Len(s) - 1
     slen = slen + LenOfChar(buf(i))
     Next i
     VNILen = slen
     End Function

    Lưu ý rằng thủ tục InitLenOfChar() phải được gọi 1 lần để khởi động giá trị đúng cho bảng LenOfChar, sau đó bạn có quyền gọi hàm VNILen() bất kỳ lúc nào với số lần bất kỳ.
     

    Chuyên mục: Lập trình