Hỏi: Chuyển đổi chữ thành ký tự!
Chào các anh, chị
Em có 1 case như thế này nhờ mọi người giúp. Liệu có cách nào chuyển đổi văn bản kiểu : ád thành asd không ạ ?
Ví dụ khác : Cộng hòa xã hội —> Coong Hoaf xax hoi
Hiểu đơn giản là lúc mình input bằng bàn phím như thế nào thì khi convert xong nó sẽ ra những ký tự y như thế ạ !
Em cảm ơn mn ạ.
Có đó bạn, có thể biến tấu từ chính là các hàm viết Unicode trong VBA.
*** Nguồn của anh @ndu96081631 (cảm ơn @huuthang_bd nhắc nhở)
Bạn sử dụng công thức
A1 = "Em ơi Hà Nội phố"
=UniConvert(A1,"VNI") –> Em o7i Ha2 No65i pho61
=UniConvert(A1,"Telex") –> Em owi Haf Nooji phoos
Function UniConvert(Text As String, InputMethod As String) As String
Dim VNI_Type, Telex_Type, CharCode, Temp, i As Long
UniConvert = Text
VNI_Type = Array("a81", "a82", "a83", "a84", "a85", "a61", "a62", "a63", "a64", "a65", "e61", _
"e62", "e63", "e64", "e65", "o61", "o62", "o63", "o64", "o65", "o71", "o72", "o73", "o74", _
"o75", "u71", "u72", "u73", "u74", "u75", "a1", "a2", "a3", "a4", "a5", "a8", "a6", "d9", _
"e1", "e2", "e3", "e4", "e5", "e6", "i1", "i2", "i3", "i4", "i5", "o1", "o2", "o3", "o4", _
"o5", "o6", "o7", "u1", "u2", "u3", "u4", "u5", "u7", "y1", "y2", "y3", "y4", "y5")
Telex_Type = Array("aws", "awf", "awr", "awx", "awj", "aas", "aaf", "aar", "aax", "aaj", "ees", _
"eef", "eer", "eex", "eej", "oos", "oof", "oor", "oox", "ooj", "ows", "owf", "owr", "owx", _
"owj", "uws", "uwf", "uwr", "uwx", "uwj", "as", "af", "ar", "ax", "aj", "aw", "aa", "dd", _
"es", "ef", "er", "ex", "ej", "ee", "is", "if", "ir", "ix", "ij", "os", "of", "or", "ox", _
"oj", "oo", "ow", "us", "uf", "ur", "ux", "uj", "uw", "ys", "yf", "yr", "yx", "yj")
CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
ChrW(7849), ChrW(7851), ChrW(7853), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), ChrW(7899), ChrW(7901), ChrW(7903), _
ChrW(7905), ChrW(7907), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), ChrW(7921), ChrW(225), _
ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), ChrW(259), ChrW(226), ChrW(273), ChrW(233), ChrW(232), _
ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), ChrW(7881), ChrW(297), ChrW(7883), _
ChrW(243), ChrW(242), ChrW(7887), ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(250), ChrW(249), _
ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
Select Case InputMethod
Case Is = "VNI": Temp = VNI_Type
Case Is = "Telex": Temp = Telex_Type
End Select
For i = 0 To UBound(Temp)
'UniConvert = Replace(UniConvert, Temp(i), CharCode(i))
UniConvert = Replace(UniConvert, CharCode(i), Temp(i))
'UniConvert = Replace(UniConvert, UCase(Temp(i)), UCase(CharCode(i)))
UniConvert = Replace(UniConvert, UCase(CharCode(i)), UCase(Temp(i)))
Next i
End Function
www.giaiphapexcel.com/diendan/threads/h%E1%BB%8Ei-c%C3%A1ch-chuy%E1%BB%83n-%C4%91%E1%BB%95i-ti%E1%BA%BFng-vi%E1%BB%87t-t%E1%BB%AB-ki%E1%BB%83u-g%C3%B5-telex-v%E1%BB%81-k%C3%BD-g%E1%BB%91c-nh%E1%BA%ADp-t%E1%BB%AB-b%C3%A0n-ph%C3%ADm.159014/post-1057751
Em cảm ơn bác ạ, em vừa thử code của bác, tuy nhiên nó không giải quyết triệt để được vấn đề convert về basic input keyboard ạ.
Ví dụ : Nghĩa : Có 2 cách viết ở Telex : Nghiax và Nghixa đều viết được, nhưng khi convert thì chỉ convert được thành 1 loại duy nhất là : Nghixa chứ không convert được thành Nghiax , em mong được giúp đỡ ạ.
891
Thì thấy dấu hỏi ngã nặng sắc huyền (?~.'`) thì chuyển gõ dấu (rxjsf) về cuối cùng là được .
Tôi tên Thắng và tôi gõ các cách sau đều được: Thawngs, Thanwgs, Thangws, Thasngw, Thansgw, Thangsw, Thawsng, Thaswng, Thawnsg, Thasnwg…
Vậy thì biết cái nào là gốc?
Các ký tự này không phải lúc nào cũng là dấu. Làm cách này chắc phải đi đường vòng, chuyển sang kiểu VNI trước, dồn số về cuối rồi chuyển kiểu VNI sang kiểu Telex.
Mình thua (ngoài khả năng).
Nhưng cũng nói để anh em nào biết vào chỉ thêm.
1. Theo như mình hiểu, font chữ được quy định thông qua bộ mã charcode, bộ gõ tiếng Việt (Telex hay Vni) cũng là 1 chuỗi các quy tắc.
Khi gõ "xuaw" hay "xuwa" đều thành "xưa" là vì bộ gõ (bộ chuyển đổi) cho phép cách nhập như vậy và chuyển đổi nó thành "x – ư – a"
đã chuyển xong thì kg thể biết xưa kia bạn gõ kiểu gì.
2. Nếu muốn thì ghi lại cái input từ bàn phím, bấm gì ra đó thì có vẽ khả dĩ hơn (Keylogger)
Đã đính chính thì xóa luôn cái link trong code nha bạn.
à, mình biết rõ nguồn thì ghi thêm, còn cái code trước khi mình edit thì đúng là copy từ blog người ta mà, có phải lấy bài của anh ndu đâu.
Chuyện blog họ xào thành của họ và kg ghi nguồn cũng đâu có phải lỗi mình 😀
Chưa hiểu ý anh.
'Ví dụ:
'Có từ kết quả "nghiax", strKQ
'Chữ hoa thường tính sau
Telex_Type = Array("aws", "awf", "awr", "awx", "awj", "aas", "aaf", "aar", "aax", "aaj", "ees", _
"eef", "eer", "eex", "eej", "oos", "oof", "oor", "oox", "ooj", "ows", "owf", "owr", "owx", _
"owj", "uws", "uwf", "uwr", "uwx", "uwj", "as", "af", "ar", "ax", "aj", "aw", "aa", "dd", _
"es", "ef", "er", "ex", "ej", "ee", "is", "if", "ir", "ix", "ij", "os", "of", "or", "ox", _
"oj", "oo", "ow", "us", "uf", "ur", "ux", "uj", "uw", "ys", "yf", "yr", "yx", "yj")
For each item in Telex_Type
If instr(1, strKQ, item) > 0 Then
strDau = vba.right(item,1)
strKytu = vba.left(item, vba.len(item)-1)
strKQ = vba.replace(strKQ, item, strKytu) & strDau
Exit for
End if
Next item
www.giaiphapexcel.com/diendan/threads/h%E1%BB%8Ei-c%C3%A1ch-chuy%E1%BB%83n-%C4%91%E1%BB%95i-ti%E1%BA%BFng-vi%E1%BB%87t-t%E1%BB%AB-ki%E1%BB%83u-g%C3%B5-telex-v%E1%BB%81-k%C3%BD-g%E1%BB%91c-nh%E1%BA%ADp-t%E1%BB%AB-b%C3%A0n-ph%C3%ADm.159014/post-1057765
À nếu duyệt các trường hợp như vậy thì không vấn đề gì, tôi tưởng ý bạn là chuyển các ký tự gõ dấu (rxjsf) về cuối từ nên nghĩ là sẽ nhầm với các ký tự không phải dùng để gõ dấu (Ví dụ: sông).
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Chuyện này hơi khó. Khó ở chỗ kết quả không hoàn toàn tin cậy. Theo lô gic toán, sự chuyển đổi chỉ tin cậy được khi hàm chuyển đổi có tính cách đơn trị trong vùng hoạt động: nếu x1 <> x2 thì f(x1) <> f(x2) và ngược lại.
Trong trường hợp này, sau khi dịch xong rồi, lỡ gặp chữ có hai cách hiểu, hoặc có kèm tiếng Anh thì sao?
Ví dụ:
tiếng Việt có cả 2 từ sông (con sông) và soong (cái nồi)
bees được hiểu là gì?
Tại sao lại "(đặc biệt là) tiếng Việt"? Việc khó hiểu chả có gì của riêng tiếng Việt cả.
Ai học ngữ pháp tiếng Anh cũng từng học qua câu này:
"I saw a man on a hill with a telescope"
Có ít nhất vài cách hiểu: cái telescope của tôi hay của người kia? và tôi có đang ở trên đồi?
Bạn kiểm tra cái này xem sao
( Nguồn thay thế trong sheet1 )
—
Cách gõ VNI chắc không áp dụng được cái này
Sửa lại đoạn code góp vui, kiểm tra trong file thấy ổn nhưng cũng không biết có đạt được hết yêu cầu khác hay không.
Public Sub Chuyen_Ve_Ky_Tu()
Dim Nguon, DL, Tam, kq(), r As Long, rw As Long, c As Long
Nguon = Sheet1.UsedRange
DL = Sheet2.Range("B4").CurrentRegion
ReDim kq(1 To UBound(DL), 1 To 1)
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "s+"
'Thêm vòng lặp thay thế các ký tự dấu cách, xuống dòng, tab… thành 1 ký tự trắng'
For r = 1 To UBound(DL)
DL(r, 1) = Replace(DL(r, 1), Chr(160), " ")
DL(r, 1) = .Replace(DL(r, 1), " ")
Next r
.Pattern = "[^a-zA-Z]+"
For r = 1 To UBound(DL)
Tam = Split(DL(r, 1), " ")
For c = 0 To UBound(Tam)
If .test(Tam(c)) Then
For rw = 1 To UBound(Nguon)
If InStr(Tam(c), Nguon(rw, 1)) Then
Tam(c) = Replace(Tam(c), Nguon(rw, 1), Nguon(rw, 2))
Tam(c) = Tam(c) & Nguon(rw, 3)
End If
Next rw
End If
'Chuyển các ký tự ",;…" cuối từ về vị trí như ban đầu, các vị trí khác để nguyên'
If .test(Tam(c)) Then
rw = .Execute(Tam(c)).Count – 1
If .Execute(Tam(c))(rw).firstindex = Len(Tam(c)) – 2 Then
Tam(c) = Replace(Tam(c), .Execute(Tam(c))(rw), "") & .Execute(Tam(c))(rw)
End If
End If
Next c
kq(r, 1) = Join(Tam, " ")
Next r
End With
Sheet2.Range("I4", Sheet2.Range("I4").End(xlDown)).ClearContents
Sheet2.Range("I4").Resize(UBound(kq), 1) = kq
End Sub
—
Bổ sung thêm chữ đ, Đ vào bảng mã
Góp vui cho bạn một hàm đơn giản (áp dụng cho Bảng mã Unicode và "biên dịch" ra kiểu gõ Telex)
Hàm loại này tôi viết cách đây nhiều năm nhưng với ý đồ khác. Chẳng hiểu cái này dùng kiểm tra lỗi chính tả là kiểm tra ra làm sao nhỉ?
——————-
Tặng bạn hàm VNTyping dùng chuyển chuỗi Unicode sang kiểu gõ VNI hoặc Telex
Cách dùng:
– Chuyển sang kiểu VNI:
– Chuyển sang kiểu Telex:
———————
Tặng luôn hàm chuyển mã ngược lại:
Hàm UniConvert thường dùng cho MsgBox tiếng Việt
VNTyping – Chuyển đổi về ký tự bàn phím theo kiểu gõ VNI, TELEX
Đang lười nhưng bị kích và cũng đang cần ngay nên fix và nâng cấp code luôn :).
Bản sửa lỗi hàm VNTyping . Thay thế "zwj", "oor", "oox", "ooj" thành "awj", "owr", "owx", "owj" là sửa được các lỗi trước đây. Code tôi sửa cho phép chuyển đổi cả CHỮ HOA (code cũ chỉ chữ thường).
Nếu người khác đã làm tốt rồi thì mình thừa kế và chỉnh sửa cho phù hợp để đáp ứng công việc cần trước đã chứ cái gì cũng tự làm cực lắm :).
Mình lấy code gốc của tác giả và chú tâm sửa lỗi ở mảng mã ký tự nên cũng không chú ý lắm đoạn cuối.
Với hàm VNTyping có lẽ dòng 63 là thừa.
Với hàm UniConvert thừa mảng ký tự chữ HOA.