Bộ gõ tiếng nhật: có nên dùng hàm chuyển đổi zenkaku-hankaku hay là nên chặn dùng bộ gõ tiếng nhật

tuhocvba

Administrator
Thành viên BQT
Một số người loay hoay xử lý dữ liệu khi người dùng xài bộ gõ tiếng nhật. Lúc này xung đột so sánh ký tự sẽ xảy ra dù ý nghĩa là như nhau.
Vấn đề zenkaku và hankaku là vấn đề muôn thưở với người làm trong công ty Nhật.
Trong một bài toán nhập số hiệu nhân viên, vì ký tự không có gì đặc biệt "VINTVN2010101" , thế thì không nên dùng hàm chuyển đổi convert zenkaku-hankaku làm gì cho mệt, có thể chặn bộ gõ tiếng Nhật ngay từ khi người ta nhập dữ liệu.

Bạn cần đăng nhập để thấy hình ảnh
 

Euler

Administrator
Thành viên BQT
Đối với việc thực hiện điều tra lấy ý kiến, thì người xây dựng tool có thể chủ động để người dùng sử dụng bộ gõ nào.
Với thiết lập IMEMode như ảnh này, người dùng dù có để bộ gõ tiếng nhật nhưng khi nhập vào thì là bộ gõ tiếng anh thông thường, cho nên mặc định thu được ký tự mong muốn mà không lo họ dùng bộ gõ 全角 hay 半角.
Bạn cần đăng nhập để thấy hình ảnh

Tuy nhiên trong trường hợp nhận được data input là file excel để cho Tool xử lý dữ liệu, thì không thể ngăn chặn được việc nhập 全角 hay 半角, vì thế việc hiểu cách chuyển đổi vẫn là cần thiết.
Mã:
StrConv(string,conversion)
Ví dụ:
Mã:
Sub Sample()
    Dim str As String
    str = "abcDEFGHI"
    MsgBox StrConv(str, vbUpperCase)    'Kết quả chuyển tất cả ký tự thành chữ in hoa: ABCDEFGHI
    MsgBox StrConv(str, vbLowerCase)    'Kết quả chuyển tất cả ký tự thành chữ in thường: abcdefghi
    MsgBox StrConv(str, vbProperCase)   'Kết quả chuyển chữ cái đầu thành chữ in hoa: Abcdefghi
    MsgBox StrConv(str, vbWide)         'Kết quả chuyển 半角 thành 全角: abcDEFGHI
    MsgBox StrConv(str, vbNarrow)       'Kết quả chuyển 全角 thành 半角: abcDEFGHI
End Sub
Hiện tại hàm StrConv có khả năng gặp sự cố với máy tính win 10 mà có thiết định vùng cũng như múi giờ, bộ gõ không phải là Nhật Bản.
Nguồn tham khảo:
Mã:
http://officetanaka.net/excel/vba/function/StrConv.htm
 

tuhocvba

Administrator
Thành viên BQT
Hàm StrConv này thật bất tiện nếu như sản phẩm này mang cho nhiều người dùng, và thiết định trên máy tính của mọi người lại không giống nhau.
StrConv関数のLocaleIDを設定することはほとんどないと思いますが、既定値は以下のWindowsの設定で変更可能です。

Windows 7
コントロールパネル(カテゴリ表示)→「時計、言語、および地域」→「日付、時刻または数値の形式の変更」→「地域と言語」ダイアログ→「形式」タブ
Windows 8、10
コントロールパネル(カテゴリ表示)→「日付、時刻、または数値の形式の変更」→「地域」ダイアログ→「形式」タブ
Tạm dịch: Hiếm khi chúng ta nghĩ cần thiết định LocaleID khi dùng hàm StrConv nhưng đôi khi định dạng vùng của Windows bị thay đổi, vì vậy bạn cần cài đặt lại theo chỉ dẫn dưới đây.
[Tùy vào win7 hay win8,10 mà chỉ dẫn khác nhau như ở trên, dưới đây là ảnh minh họa.
Bạn cần đăng nhập để thấy hình ảnh


Nguồn:
Mã:
https://vbabeginner.net/vba%E9%96%A2%E6%95%B0%EF%BC%9A%E6%96%87%E5%AD%97%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%82%92%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%EF%BC%88strconv%EF%BC%89/
 

Euler

Administrator
Thành viên BQT
Hình ảnh hướng dẫn chỗ thiết định cho win 10 trông như thế này:
Bạn cần đăng nhập để thấy hình ảnh

Hàm StrConv vì vậy trở nên khá bất tiện. Để giải quyết triệt để vấn đề convert zenkaku->hankaku, có lẽ nên tự xây dựng hàm riêng.
 

tuhocvba

Administrator
Thành viên BQT
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.
Mã:
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:







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.
Mã:
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.
 
Top