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ỳ.