Tôi giả thiết data của tôi chỉ có chữ và số, dấu cách phân tách các từ- là các ký tự mang ý nghĩa:
"A->Z, a->z,0->9"
Còn các ký tự khác như gạch nối, dấu chấm phẩy, ... không tạo nên ý nghĩa.
Cái này tùy thuộc vào data của người dùng mà có sự phán đoán khác nhau nhé.
Bây giờ tôi cần xây dựng hàm chuyển đổi zenkaku các ký tự nằm trong dải trên thành hankaku.
Sub vidu()
MsgBox Asc("string_input")
End Sub
Bằng lệnh code đơn giản như thế này, tôi nhập các kí tự sau bằng kiểu gõ zenkaku vào code trên:
A
Z
a
z
0
9
Tôi thu được mã ascii tương ứng.
A -32160
Z -32135
a -32127
z -32102
0 -32177
9 -32168
Bằng cách tương tự, tôi dùng bộ gõ tiếng anh thông thường và thu được kết quả:
A 65
Z 90
a 97
z 122
0 48
9 57
Như vậy ta có một quy luật bất biến: asc(hankaku)-asc(zenkaku) = 32225
Trừ trường hợp rất đặc biệt dấu cách:
asc(zenkaku(space)) = -32448
asc(hankaku(space)) = 32
Giả sử ta có một ký tự zenkaku -> lấy được asc(zenkaku) -> lấy được asc(hankaku)
Từ đó bằng cách ngược lại, từ mã asc ta lấy về ký tự mong muốn ->chr(asc(hankaku)) = ký tự thông thường.
Ta xây dựng hàm chuyển đổi các ký tự zenkaku thành hankaku bằng cách nghĩ như trên.
Ngoài các ký tự được nói tới ở trên thì có khả năng không còn đúng. Vì vậy hãy thật chắc chắn về data mình sẽ xử lý có những ký tự nào.
Bằng cách nghĩ tương tự, bạn có thể tự xây dựng hàm riêng.
Function convertzenkakutohankaku(ByVal s As String) As String
Dim i As Integer
Dim out As String
Dim c As String
Dim ch As String
If Len(s) < 1 Then
convertzenkakutohankaku = ""
Exit Function
Else
out = ""
For i = 1 To Len(s) Step 1
c = Mid(s, 1, 1)
If Asc(c) = -32448 Then
out = out & Chr(32)
Else
If Asc(c) >= -32168 And Asc(c) <= -32160 Then
ch = Chr(32225 + Asc(c))
out = out & ch
Else
out = out & c
End If
End If
Next i
End If
convertzenkakutohankaku = out
End Function
Các hàm asc và chr đều là các hàm phổ thông, không có xung đột nào với cài đặt trên máy tính.
Vì vậy hoàn toàn yên tâm.