'MacroName:Thai2Latin 'MacroDescription:Automatically transliterate Thai characters into Latin characters 'Macro created by: Joel Hahn, Niles Public Library District 'Macro last modified: 6 March 2012 Declare Function TransThai(sChar As String, sNextChar As String, nPos As Variant, sCharType As String) As String Declare Function IsThaiChar(sNCR) As Integer Global arrChars() Option Explicit Sub Main Dim CharacterSet As Integer Dim bool as Integer Dim sField As String Dim nHasThai as integer Dim NewField As String Dim i, a, m Dim sHex As String Dim nHex As Long Dim TempChar As String Dim place3 as Integer Dim place As Integer Dim sBCR As String Dim sLang As String Dim sInitialMedialFinal As String Dim nNeedToFlip as Integer Dim nFlippedVowel As Integer Dim sCurChar, sNextChar As String Dim CS As Object Set CS = CreateObject("Connex.Client") ReDim arrChars(0) 'nCurRow = CS.CursorRow ' Select Case CS.ItemType ' Case 0, 1, 2, 3, 4, 14, 17, 18, 19, 20, 35 ' 'Viewing a MARC record; proceed ' Case Else ' MsgBox "Not viewing a MARC record. Exiting..." ' Exit Sub ' End Select 'CS.CursorRow = nCurRow bool = CS.GetFieldLineUnicode(CS.CursorRow, sField) NewField = Left(sField, 5) sField = Mid(sField, 6) i = 1 : nHasThai = 0 Do While i <= Len(sField) - 7 a = Mid(sField, i, 8) If IsThaiChar(Mid(sField, i, 6)) Then nHasThai = 1 Exit Do End If i = i + 1 Loop If nHasThai = 0 Then MsgBox "Field contains no Thai characters. Exiting..." Exit Sub End If 'Break up Thai field in to separate characters i = 1 Do While i <= Len(sField) ReDim Preserve arrChars(UBound(arrChars) + 1) If Mid(sField, i, 3) = "&#x" Then place = InStr(i, sField, ";") sBCR = Mid(sField, i, (place - i) + 1) If i > 1 Then If Len(arrChars(UBound(arrChars)-1)) > 1 Then sHex = Mid(arrChars(UBound(arrChars)-1), 4, Len(arrChars(UBound(arrChars)-1)) - 2) nHex = Val("&H" & sHex) Select Case nHex Case &H0E40 To &H0E44 If nFlippedVowel = 1 Then arrChars(UBound(arrChars)) = sBCR nFlippedVowel = 0 Else arrChars(UBound(arrChars)) = arrChars(UBound(arrChars)-1) arrChars(UBound(arrChars)-1) = sBCR nFlippedVowel = 1 End If Case &H0E48 To &H0E4B 'Remove tone marks from consideration ReDim Preserve arrChars(UBound(arrChars) - 1) arrChars(UBound(arrChars)) = sBCR nFlippedVowel = 0 Case Else arrChars(UBound(arrChars)) = sBCR nFlippedVowel = 0 End Select Else arrChars(UBound(arrChars)) = sBCR nFlippedVowel = 0 End If Else arrChars(UBound(arrChars)) = sBCR nFlippedVowel = 0 End If i = place Else arrChars(UBound(arrChars)) = Mid(sField, i, 1) nFlippedVowel = 0 End If i = i + 1 Loop i = 1 Do While i <= UBound(arrChars) sInitialMedialFinal = "" If InStr(arrChars(i), "&#x") Then sHex = Mid(arrChars(i), 4, Len(arrChars(i)) - 2) nHex = Val("&H" & sHex) Select Case nHex Case &H0000 'Do nothing; character already processed Case &H01C2 NewField = NewField & Chr(223) 'delimiter Case &H0E01 To &H0E5F If i < UBound(arrChars) Then If i = 1 Then sInitialMedialFinal = "I" ElseIf i = Len(sField) Then sInitialMedialFinal = "F" ElseIf i > 1 And i < Len(sField) Then If InStr(" !@#$%^&*()[]{};:.,/?\=+-'" & Chr(34), arrChars(i-1)) Then sInitialMedialFinal = "I" ElseIf InStr(" !@#$%^&*()[]{};:.,/?\=+-'" & Chr(34), arrChars(i+1)) Then sInitialMedialFinal = "F" Else sInitialMedialFinal = "M" End If End If sCurChar = arrChars(i) sNextChar = arrChars(i+1) TempChar = TransThai(sCurChar, sNextChar, i, sInitialMedialFinal) If arrChars(i) = "ร" And sInitialMedialFinal = "F" And Right(NewField, 1) = "a" And (arrChars(i-1) >= "ก" And arrChars(i-1) <= "&x0E2E;") Then NewField = Left(NewField, Len(NewField) - 1) & "o" & Chr(229) & Chr(248) 'o-macron-ogonek ElseIf arrChars(i) = "ร" And arrChars(i-1) = "ร" And Right(NewField, 1) = "r" Then If sInitialMedialFinal = "F" Then NewField = Left(NewField, Len(NewField) - 1) & "an" Else NewField = Left(NewField, Len(NewField) - 1) & "a" End If ElseIf arrChars(i) = "ๆ" Then m = Len(NewField) - 1 Do While m >= 6 If Mid(NewField, m, 1) Like "[bcdfghjklmnpqrstvwxyz]" Then If Mid(NewField, m, 1) = "h" And (Mid(NewField, m - 1, 1) Like "[ckpt]" Or Mid(NewField, m - 1, 1) = Chr(233)) then m = m - 1 End If Exit Do End If m = m - 1 Loop NewField = NewField & Mid(NewField, m) End If 'If arrChars(i+1) = "़" Or arrChars(i+1) = "्" Then i = i + 1 Else sInitialMedialFinal = "F" TempChar = TransThai(arrChars(i), "&H0000;", i, sInitialMedialFinal) If arrChars(i) = "ร" And Right(NewField, 1) = "a" And (arrChars(i-1) >= "ก" And arrChars(i-1) <= "&x0E2E;") Then NewField = Left(NewField, Len(NewField) - 1) & "o" & Chr(229) & Chr(248) 'o-macron-ogonek ElseIf arrChars(i) = "ร" And arrChars(i-1) = "ร" And Right(NewField, 1) = "r" Then NewField = Left(NewField, Len(NewField) - 1) & "an" ElseIf arrChars(i) = "ๆ" Then m = Len(NewField) - 1 Do While m >= 6 If Mid(NewField, m, 1) Like "[bcdfghjklmnpqrstvwxyz]" Then If Mid(NewField, m, 1) = "h" And (Mid(NewField, m - 1, 1) Like "[ckpt]" Or Mid(NewField, m - 1, 1) = Chr(233)) then m = m - 1 End If Exit Do End If m = m - 1 Loop NewField = NewField & Mid(NewField, m) TempChar = "" End If End If NewField = NewField & TempChar Case Else NewField = NewField & Chr(252) 'non-Thai Unicode character End Select Else If i > 1 And arrChars(i) = " " And Right(NewField, 1) = " " Then NewField = RTrim(NewField) NewField = NewField & arrChars(i) End If i = i + 1 Loop 'Capitalize first word in each subfield If Mid(NewField, 6, 1) Like "[A-Za-z]" Then Mid(NewField, 6, 1) = UCase(Mid(NewField, 6, 1)) ElseIf Mid(NewField, 6, 1) = Chr(181) Then 'ae Mid(NewField, 6, 1) = Chr(165) ElseIf Mid(NewField, 6, 1) = Chr(182) Then 'oe Mid(NewField, 6, 1) = Chr(166) ElseIf Mid(NewField, 6, 1) = Chr(189) Then 'u-hook Mid(NewField, 6, 1) = Chr(173) Else i = 6 If Mid(NewField, i, 1) = Chr(223) Then i = 8 Do While ((Mid(NewField, i, 1) Like "[!a-z]") And i <= Len(NewField)) i = i + 1 Loop If (Mid(NewField, i-1, 1) <> "#") And (Mid(NewField, i-1, 1) Like "[!A-Z]") And Not (Mid(NewField, i-2, 2) Like "[0-9]-") Then Mid(NewField, i, 1) = UCase(Mid(NewField, i, 1)) End If End If place3 = 5 Do While InStr(place3, NewField, Chr(223) ) 'ǂ") 'place3 = InStr(place3, NewField, "ǂ") + 9 place3 = InStr(place3, NewField, Chr(223) ) + 2 Do Until ((Mid(NewField, place3, 1) Like "[A-WY-Za-z]") Or place3 > Len(NewField)) place3 = place3 + 1 Loop If place3 <= Len(NewField) Then If (Mid(NewField, place3, 1) Like "[a-z]") Then If Mid(NewField, place3-1, 1) <> "#" Then Mid(NewField, place3, 1) = UCase(Mid(NewField, place3, 1)) End If End If place3 = place3 + 1 Loop bool = CS.AddFieldLine(CS.CursorRow + 1, NewField) CS.CursorRow = CS.CursorRow -1 CS.SendKeys "%ekl", -1 End Sub '############################################################################## Function TransThai(sChar As String, sNextChar As String, nPos As Variant, sCharType As String) As String Dim sHex As String Dim nHex As Integer Dim TempTranslit As String Dim sNextHex As String Dim nNextHex As Long Dim IsConsonant As Integer Dim j As Integer Dim nSkipChar As Integer IsConsonant = 0 nSkipChar = 0 sHex = Mid(sChar, 4, Len(sChar) - 2) nHex = Val("&H" & sHex) sNextHex = Mid(sNextChar, 4, Len(sNextChar) - 1) nNextHex = Val("&H" & sNextHex) Select Case nHex 'Consonants Case &H0E01 IsConsonant = 1 TempTranslit = "k" If sCharType = "I" Then Select Case nNextHex Case &H0E23 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ม" Then IsConsonant = 0 TempTranslit = "Krom " arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" End If End If Case &H0E29 If nPos + 7 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) & arrChars(nPos + 7) = "ัตริย์" Then 'Kasat IsConsonant = 0 TempTranslit = "kasat " For j = 1 to 7 arrChars(nPos + j) = "�" Next End If End If Case &H0E32 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ร" Then IsConsonant = 0 TempTranslit = "ka" + Chr(229) + "n" 'ka-macron-n arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" End If End If End Select End If Case &H0E02 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "k" ElseIf sCharType = "I" Then TempTranslit = "kh" Select Case nNextHex Case &H0E2D IsConsonant = 0 TempTranslit = "kho" & Chr(229) & Chr(248) 'kho-macron-ogonek arrChars(nPos + 1) = "�" End Select Else TempTranslit = "kh" End If Case &H0E03, &H0E05, &H0E06 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "k" Else TempTranslit = "kh" End If Case &H0E04 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "k" ElseIf sCharType = "I" Then TempTranslit = "kh" Select Case nNextHex Case &H0E19 IsConsonant = 0 TempTranslit = "khon" arrChars(nPos + 1) = "�" Case &H0E27 If nPos + 3 <= UBound(arrChars) Then If arrChars(nPos + 2) = "า" And arrChars(nPos + 3) = "ม" Then IsConsonant = 0 TempTranslit = "khwa" & Chr(229) & "m" 'khwa-macron-m arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" arrChars(nPos + 3) = "�" End If End If Case &H0E33 IsConsonant = 0 TempTranslit = "kham" arrChars(nPos + 1) = "�" Case &H0E38 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ณ" Then IsConsonant = 0 TempTranslit = "Khun " arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" End If End If Case &H0E40 If nPos + 5 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ร" And arrChars(nPos + 3) = "ื" And arrChars(nPos + 4) = "อ" And arrChars(nPos + 5) = "ง" Then IsConsonant = 0 TempTranslit = "khr" & Chr(189) & Chr(229) & "ang" For j = 1 to 5 arrChars(nPos + j) = "�" Next End If End If End Select Else TempTranslit = "kh" End If Case &H0E07 IsConsonant = 1 TempTranslit = "ng" If sCharType = "I" Then Select Case nNextHex Case &H0E32 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "น" Then IsConsonant = 0 TempTranslit = "nga" & Chr(229) & "n " arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" End If End If End Select End If Case &H0E08 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" Else TempTranslit = "c" & Chr(233) & "h" 'C-hacek-h End If Case &H0E09, &H0E0C IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" Else TempTranslit = "ch" End If Case &H0E0A IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" ElseIf sCharType = "I" Then TempTranslit = "ch" Select Case nNextHex Case &H0E32 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ง" Then IsConsonant = 0 TempTranslit = "cha" & Chr(229) & "ng" 'cha-macron-ng nSkipChar = 2 ElseIf arrChars(nPos + 2) = "ว" Then IsConsonant = 0 TempTranslit = "cha" & Chr(229) & "o" 'cha-macron-o nSkipChar = 2 ElseIf arrChars(nPos + 2) = "ๆ" Then IsConsonant = 0 TempTranslit = "cha" & Chr(229) & " cha" & Chr(229) 'cha-macron cha-macron nSkipChar = 2 End If End If End Select Else TempTranslit = "ch" Select Case nNextHex Case &H0E32 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ๆ" Then IsConsonant = 0 TempTranslit = "cha" & Chr(229) & " cha" & Chr(229) & " " 'cha-macron cha-macron nSkipChar = 2 End If End If End Select End If Case &H0E0B, &H0E29 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" Else TempTranslit = "s" End If Case &H0E0D IsConsonant = 1 If sCharType = "F" Then TempTranslit = "n" Else TempTranslit = "y" End If Case &H0E0E IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" Else TempTranslit = "d" End If Case &H0E0F IsConsonant = 1 TempTranslit = "t" Case &H0E10, &H0E11, &H0E12, &H0E16, &H0E18 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" Else TempTranslit = "th" End If Case &H0E13 IsConsonant = 1 TempTranslit = "n" Case &H0E14 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" ElseIf sCharType = "I" Then TempTranslit = "d" Select Case nNextHex Case &H0E27 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ง" Then IsConsonant = 0 TempTranslit = "du" & Chr(229) & "ang" 'du-macron-ang nSkipChar = 2 End If End If Case &H0E40 If nPos + 3 <= UBound(arrChars) Then If arrChars(nPos + 2) = "็" And arrChars(nPos + 3) = "ก" Then IsConsonant = 0 TempTranslit = "dek" nSkipChar = 3 End If End If End Select Else TempTranslit = "d" End If Case &H0E15 IsConsonant = 1 TempTranslit = "t" If sCharType = "I" Then Select Case nNextHex Case &H0E19 IsConsonant = 0 TempTranslit = "ton" arrChars(nPos + 1) = "�" Case &H0E32 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ง" Then IsConsonant = 0 TempTranslit = "ta" & Chr(229) & "ng " 'ta-macron-ng" nSkipChar = 2 If nPos + 3 <= UBound(arrChars) Then If arrChars(nPos + 3) = "ๆ" Then TempTranslit = "ta" & Chr(229) & "ng ta" & Chr(229) & "ng " 'ta-macron-ng ta-macron-ng nSkipChar = 3 End If End If End If End If End Select End If Select Case nNextHex Case &H0E32 If nPos + 3 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ง" and arrChars(nPos + 3) = "ๆ" Then IsConsonant = 0 TempTranslit = "ta" & Chr(229) & "ng ta" & Chr(229) & "ng " 'ta-macron-ng ta-macron-ng nSkipChar = 3 End If End If End Select Case &H0E17 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" Else Select Case nNextHex Case &H0E23 TempTranslit = "s" arrChars(nPos + 1) = "�" Case &H0E2B TemPTranslit = "th" If sCharType = "I" Then If nPos + 3 <= UBound(arrChars) Then If arrChars(nPos + 2) = "า" And arrChars(nPos + 3) = "ร" Then IsConsonant = 0 TempTranslit = "thaha" & Chr(229) & "n " nSkipChar = 3 End If End If End If Case &H0E2D TempTranslit = "th" If sCharType = "I" Then If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ง" Then IsConsonant = 0 TempTranslit = "tho" & Chr(229) & Chr(248) & "ng" 'tho-macron-ogonek-ng nSkipChar = 2 End If End If End If Case &H0E31 TempTranslit = "th" If sCharType = "I" Then If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ง" Then IsConsonant = 0 TempTranslit = "thang " nSkipChar = 2 End If End If End If Case &H0E38 TempTranslit = "th" If sCharType = "I" Then If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ก" Then IsConsonant = 0 TempTranslit = "thuk " nSkipChar = 2 End If End If End If Case &H0E44 TempTranslit = "th" If sCharType = "I" Then If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ย" Then IsConsonant = 0 TempTranslit = "Thai " nSkipChar = 2 End If End If End If Case Else TempTranslit = "th" End Select End If Case &H0E19 IsConsonant = 1 TempTranslit = "n" If sCharType = "I" Then Select Case nNextHex Case &H0E2D If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ง" Then IsConsonant = 0 TempTranslit = "no" & Chr(229) & Chr(248) & "ng" 'no-macron-ogonek-ng nSkipChar = 2 End If End If Case &H0E31 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ก" Then IsConsonant = 0 TempTranslit = "nak" nSkipChar = 2 End If End If Case &H0E32 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ง" Then IsConsonant = 0 TempTranslit = "na" & Chr(229) & "ng" 'na-macronng nSkipChar = 2 End If End If End Select End If Case &H0E1A IsConsonant = 1 If sCharType = "F" Then TempTranslit = "p" ElseIf sCharType = "I" Then TempTranslit = "b" Select Case nNextHex Case &H0E17 IsConsonant = 0 TempTranslit = "bot" arrChars(nPos + 1) = "�" Case &H0E32 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ง" Then IsConsonant = 0 TempTranslit = "ba" & Chr(229) & "ng " 'ba-macron-ng" nSkipChar = 2 End If End If Case &H0E38 If nPos + 4 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) = "คคล" Then IsConsonant = 0 TempTranslit = "bukkhon " nSkipChar = 4 End If ElseIf nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ญ" Then IsConsonant = 0 TempTranslit = "bun" nSkipChar = 2 End If End If End Select Else TempTranslit = "b" End If Case &H0E1B IsConsonant = 1 TempTranslit = "p" If sCharType = "I" Then Select Case nNextHex Case &H0E0F If nPos + 9 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) & arrChars(nPos + 7) & arrChars(nPos + 8) & arrChars(nPos + 9) = "ิบัติการ" Then IsConsonant = 0 TempTranslit = "patibatka" & Chr(229) & "n" nSkipChar = 9 End If End If End Select End If Case &H0E1C IsConsonant = 1 If sCharType = "F" Then TempTranslit = "p" ElseIf sCharType = "I" Then TempTranslit = "ph" Select Case nNextHex Case &H0E41 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "น" Then IsConsonant = 0 Temptranslit = "ph" & Chr(181) & Chr(229) & "n" 'phae-macron-n nSkipChar = 2 End If End If End Select Else TempTranslit = "ph" End If Case &H0E1E IsConsonant = 1 If sCharType = "F" Then TempTranslit = "p" Else TempTranslit = "ph" Select Case nNextHex Case &H0E23 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ะ" Then IsConsonant = 0 TempTranslit = "Phra " nSkipChar = 2 End If End If If nPos + 5 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ะ" And arrChars(nPos + 3) = "ม" And arrChars(nPos + 4) = "ห" And arrChars(nPos + 5) = "า" Then IsConsonant = 0 TempTranslit = "Phra Maha" & Chr(229) & " " nSkipChar = 5 ElseIf arrChars(nPos + 2) = "ะ" And arrChars(nPos + 3) = "ค" And arrChars(nPos + 4) = "ร" And arrChars(nPos + 5) = "ู" Then IsConsonant = 0 TempTranslit = "Phra Kru" & Chr(229) & " " nSkipChar = 5 ElseIf arrChars(nPos + 2) = "ะ" Then IsConsonant = 0 TempTranslit = "Phra " nSkipChar = 2 End If End If If nPos + 9 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ะ" And arrChars(nPos + 3) = "อ" And arrChars(nPos + 4) = "า" And arrChars(nPos + 5) = "จ" And arrChars(nPos + 6) = "า" And arrChars(nPos + 7) = "&#xoE23;" And arrChars(nPos + 8) = "ย" And arrChars(nPos + 9) = "์" Then IsConsonant = 0 TempTranslit = "Phra " & Chr(176) & "A" & Chr(229) & "c" & Chr(233) & "ha" & Chr(229) & "n " nSkipChar = 9 End If End If Case &H0E24 If sCharType = "I" And nPos + 7 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) & arrChars(nPos + 7) = "ติกรรม" Then IsConsonant = 0 TempTranslit = "phr" & Chr(189) & "ttikam" nSkipChar = 7 End If End If Case &H0E25 If sCharType = "I" And nPos + 6 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) = "มเือง" Then IsConsonant = 0 TempTranslit = "phonlam" & Chr(189) & Chr(229) & "ang" nSkipChar = 6 End If End If Case &H0E2D If sCharType = "I" Then IsConsonant = 0 TempTranslit = "pho" & Chr(229) & Chr(248) 'pho-macron-ogonek arrChars(nPos + 1) = "�" End If End Select End If Case &H0E1D, &H0E1F IsConsonant = 1 If sCharType = "F" Then TempTranslit = "p" Else TempTranslit = "f" End If Case &H0E20 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "p" Else TempTranslit = "ph" If sCharType = "I" Then Select Case nNextHex Case &H0E32 If nPos + 5 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) = "รรโง" Then IsConsonant = 0 TempTranslit = "pha" & Chr(229) & "nro" & Chr(229) & "ng" nSkipChar = 5 End If End If End Select End If End If Case &H0E21 IsConsonant = 1 TempTranslit = "m" If sCharType = "I" Then Select Case nNextHex Case &H0E2B If nPos + 10 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) & arrChars(nPos + 7) & arrChars(nPos + 8) & arrChars(nPos + 9) & arrChars(nPos + 10) = "าวิทยาลัย" Then IsConsonant = 0 TempTranslit = "maha" & Chr(229) & "witthaya" & Chr(229) & "lai" nSkipChar = 10 End If End If End Select End If Case &H0E22 If sCharType = "F" Then TempTranslit = "" Else IsConsonant = 1 TempTranslit = "y" If sCharType = "I" Then Select Case nNextHex Case &H0E38 If nPos + 7 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) & arrChars(nPos + 7) = "ติธรรม" Then IsConsonant = 0 TempTranslit = "yuttitham" nSkipChar = 7 End If End If If nPos + 9 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) & arrChars(nPos + 7) & arrChars(nPos + 8) & arrChars(nPos + 9) = "ทธศาสตร์" Then IsConsonant = 0 TempTranslit = "yutthasa" & Chr(229) & "t" nSkipChar = 9 End If End If End Select End If End If Case &H0E23 If sCharType = "F" Then IsConsonant = 1 TempTranslit = "n" Select Case nNextHex Case &H0E23 IsConsonant = 0 TempTranslit = "an" arrChars(nPos + 1) = "�" End Select ElseIf sCharType = "M" Then IsConsonant = 1 TempTranslit = "n" Select Case nNextHex Case &HE23 IsConsonant = 0 TempTranslit = "a" arrChars(nPos + 1) = "�" Case &H0E40 If nPos + 4 <= UBound(arrChars) Then If arrChars(nPos + 2) = "็" And arrChars(nPos + 2) = "ั" And arrChars(nPos + 4) = "ๆ" Then IsConsonant = 0 Temptranslit = "reo reo " nSkipChar = 4 End If End If End Select Else IsConsonant = 1 TempTranslit = "r" Select Case nNextHex Case &H0E40 If nPos + 4 <= UBound(arrChars) Then If arrChars(nPos + 2) = "็" And arrChars(nPos + 3) = "ว" And arrChars(nPos + 4) = "ๆ" Then IsConsonant = 0 Temptranslit = "reo reo " nSkipChar = 4 End If End If End Select End If Case &H0E25 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "n" Else TempTranslit = "l" Select Case nNextHex Case &H0E39 If sCharType = "I" And nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ก" Then IsConsonant = 0 TempTranslit = "lu" & Chr(229) & "k" 'lu-macron-k nSkipChar = 2 End If End If End Select End If Case &H0E27 If sCharType = "F" Then TempTranslit = "" Else IsConsonant = 1 TempTranslit = "w" Select Case nNextHex Case &H0E22 TempTranslit = "u" & Chr(229) & "ai" arrChars(nPos + 1) = "�" Case &H0E31 If sCharType = "I" And nPos + 7 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) & arrChars(nPos + 7) = "ฒนธรรม" Then IsConsonant = 0 TempTranslit = "watthanatham" nSkipChar = 7 End If End If Case Else End Select End If Case &H0E28 IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" Else TempTranslit = "s" If sCharType = "I" Then Select Case nNextHex Case &H0E40 If nPos + 7 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) & arrChars(nPos + 7) = "รษฐกิจ" Then IsConsonant = 0 TempTranslit = "se" & Chr(229) & "tthakit" nSkipChar = 7 End If End If End Select End If End If Case &H0E2A IsConsonant = 1 If sCharType = "F" Then TempTranslit = "t" ElseIf sCharType = "I" Then TempTranslit = "s" Select Case nNextHex Case &H0E27 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "น" Then IsConsonant = 0 TempTranslit = "su" & Chr(229) & "an " nSkipChar = 2 End If End If Case &H0E21 If nPos + 6 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) = "บูรณ์" Then IsConsonant = 0 TempTranslit = "sombu" & Chr(229) & "n " nSkipChar = 6 End If End If End Select Else TempTranslit = "s" End If Case &H0E2B If sCharType = "F" Then TempTranslit = "" ElseIf sCharType = "I" Then IsConsonant = 1 TempTranslit = "h" Select Case nNextHex Case &H0E21 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "อ" Then IsConsonant = 0 TempTranslit = "mo" & Chr(229) & Chr(248) 'mo-macron-ogonek arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" End If End If Case &H0E25 If nPos + 3 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ว" & arrChars(nPos + 3) = "ง" Then IsConsonant = 0 TempTranslit = "lu" & Chr(229) & "ang" arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" arrChars(nPos + 3) = "�" End If End If Case &H0E2D IsConsonant = 0 TempTranslit = "ho" & Chr(229) & Chr(248) 'ho-macron-ogonek arrChars(nPos + 1) = "�" End Select Else IsConsonant = 1 TempTranslit = "h" End If Case &H0E2C IsConsonant = 1 If sCharType = "F" Then TempTranslit = "n" Else TempTranslit = "l" End If Case &H0E2D If sCharType = "F" Then TempTranslit = "o" & Chr(229) & Chr(248) 'o-macron-ogonek ElseIf sCharType = "I" Then TempTranslit = Chr(176) Select Case nNextHex Case &H0E07 If nPos + 6 <= UBound(arrChars) Then If arrChars(nPos + 2) & arrChars(nPos + 3) & arrChars(nPos + 4) & arrChars(nPos + 5) & arrChars(nPos + 6) = "ค์การ" Then IsConsonant = 0 TempTranslit = Chr(176) & "ongka" & Chr(229) & "n" nSkipChar = 6 End If End If Case &H0E24, &H0E26, &H0E30 To &H0E39, &H0E40 To &H0E44 TempTranslit = "" Case &H0E22 TempTranslit = "o" & Chr(229) & Chr(248) & "i" 'o-macron-ogonek-i arrChars(nPos + 1) = "�" End Select Else TempTranslit = Chr(176) 'ayn Select Case nNextHex Case &H0E22 TempTranslit = "o" & Chr(229) & Chr(248) & "i" 'o-macron-ogonek-i End Select End If Case &H0E2E If sCharType = "F" Then TempTranslit = "" Else IsConsonant = 1 TempTranslit = "h" End If Case &H0E45, &H0E47, &H0E4D, &H0E4E, &H0E4F, &H0E5A, &H0E5B TempTranslit = "" Case &H0E46 If sCharType = "F" or sCharType = "M" Then 'Repeat the previous syllable TempTranslit = "[repeat]" Else TempTranslit = "" End If 'Punctuation & Numbers Case &H0E3F TempTranslit = "[baht]" Case &H0E2F TempTranslit = "..." Select Case nNextHex Case &HE23 If nPos + 2 < UBound(arrChars) Then If arrChars(nPos + 2) = "" Then TempTranslit = "la" arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" End If End If End Select Case &H0E50 TempTranslit = "0" Case &H0E51 TempTranslit = "1" Case &H0E52 TempTranslit = "2" Case &H0E53 TempTranslit = "3" Case &H0E54 TempTranslit = "4" Case &H0E55 TempTranslit = "5" Case &H0E56 TempTranslit = "6" Case &H0E57 TempTranslit = "7" Case &H0E58 TempTranslit = "8" Case &H0E59 TempTranslit = "9" 'Tone Marks Case &H0E48 To &H0E4B TempTranslit = "" 'Vowels Case &H0E24 TempTranslit = "r" & Chr(189) 'ru-hook Select Case nNextHex Case &H0E32, &H0E45 TempTranslit = "r" & Chr(189) & Chr(229) 'ru-hook-macron arrChars(nPos + 1) = "�" End Select Case &H0E26 TempTranslit = "l" & Chr(189) 'lu-hook Select Case nNextHex Case &H0E32, &H0E45 TempTranslit = "l" & Chr(189) & Chr(229) 'lu-hook-macron arrChars(nPos + 1) = "�" End Select Case &H0E27 If arrChars(nPos + 2) = "ย" Then TempTranslit = "u" & Chr(229) & "ai" 'u-macron-ai arrChars(nPos + 2) = "�" End If Case &H0E30 TempTranslit = "a" Case &H0E31 TempTranslit = "a" Select Case nNextHex Case &H0E22 TempTranslit = "ai" arrChars(nPos + 1) = "�" Case &H0E27 TempTranslit = "u" & Chr(229) & "a" 'u-macron-a arrChars(nPos + 1) = "�" If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ะ" Then TempTranslit = "ua" arrChars(nPos + 2) = "�" End If End If End Select Case &H0E32 TempTranslit = "a" & Chr(229) 'a-macron Select Case nNextHex Case &H0E22 TempTranslit = "a" & Chr(229) & "i" 'a-macron-i arrChars(nPos + 1) = "�" Case &H0E27 TempTranslit = "a" & Chr(229) & "o" 'a-macron-o arrChars(nPos + 1) = "�" End Select Case &H0E33 TempTranslit = "am" Case &H0E34 TempTranslit = "i" Select Case nNextHex Case &H0E27 TempTranslit = "iu" arrChars(nPos + 1) = "�" End Select Case &H0E35 TempTranslit = "i" & Chr(229) 'i-macron Case &H0E36 If sCharType = "I" Then TempTranslit = Chr(173) 'U-hook Else TempTranslit = Chr(189) 'u-hook End If Case &H0E37 If sCharType = "I" Then TempTranslit = Chr(173) & Chr(229) 'U-hook-macron Else TempTranslit = Chr(189) & Chr(229) 'U-hook-macron End If Case &H0E38 TempTranslit = "u" Select Case nNextHex Case &H0E22 TempTranslit = "ui" arrChars(nPos + 1) = "�" End Select Case &H0E39 TempTranslit = "u" & Chr(229) 'u-macron Case &H0E40 TempTranslit = "e" & Chr(229) 'e-macron Select Case nNextHex Case &H0E22 TempTranslit = Chr(182) & Chr(229) & "i" 'oe-ligature-macron-i arrChars(nPos + 1) = "�" Case &H0E27 TempTranslit = "e" & Chr(229) & "o" 'e-macron-o arrChars(nPos + 1) = "�" Case &H0E2D TempTranslit = Chr(182) & Chr(229) 'oe-ligature-macron arrChars(nPos + 1) = "�" If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ะ" Then TempTranslit = Chr(182) 'oe-ligature arrChars(nPos + 2) = "�" End If End If Case &H0E30 TempTranslit = "e" arrChars(nPos + 1) = "�" Case &H0E32 TempTranslit = "ao" arrChars(nPos + 1) = "�" If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ะ" Then TempTranslit = "o" & Chr(248) 'o-ogonek arrChars(nPos + 2) = "�" End If End If Case &H0E34 TempTranslit = Chr(182) & Chr(229) 'oe-macron arrChars(nPos + 1) = "�" If nPos + 3 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ย" Then TempTranslit = "i" & Chr(229) & "a" arrChars(nPos + 2) = "�" If arrChars(nPos + 3) = "ะ" Then TempTranslit = "ia" arrChars(nPos + 3) = "�" End If End If ElseIf nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ย" Then TempTranslit = "i" & Chr(229) & "a" arrChars(nPos + 2) = "�" End If End If Case &H0E35 If arrChars(nPos + 2) = "ย" And arrChars(nPos + 3) = "ว" Then TempTranslit = "i" & Chr(229) & "eo" 'i-macron-eo arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" arrChars(nPos + 3) = "�" End If Case &H0E37 If nPos + 3 <= UBound(arrChars) Then If arrChars(nPos + 2) = "อ" Then Temptranslit = Chr(189) & Chr(229) & "a" 'u-hook-macron-a arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" If arrChars(nPos + 3) = "ย" Then Temptranslit = Chr(189) & Chr(229) & "ai" 'u-hook-macron-ai arrChars(nPos + 3) = "�" ElseIf arrChars(nPos + 3) = "ะ" Then Temptranslit = Chr(189) & "a" 'u-hook-a arrChars(nPos + 3) = "�" End If End If ElseIf nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "อ" Then Temptranslit = Chr(189) & Chr(229) & "a" 'u-hook-macron-a arrChars(nPos + 1) = "�" arrChars(nPos + 2) = "�" 'If nPos + 3 <= UBound(arrChars) Then ' If arrChars(nPos + 3) = "ะ" Then ' Temptranslit = Chr(182) 'oe-ligature ' arrChars(nPos + 3) = "�" ' End If 'End If End If End If Case &H0E47 TempTranslit = "e" arrChars(nPos + 1) = "�" If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ว" Then TempTranslit = "eo" arrChars(nPos + 2) = "�" End If End If End Select Case &H0E41 If sCharType = "I" Then TempTranslit = Chr(165) & Chr(229) 'AE-macron Else TempTranslit = Chr(181) & Chr(229) 'ae-macron End If Select Case nNextHex Case &H0E27 TempTranslit = Chr(181) & Chr(229) & "o" 'ae-macron-o arrChars(nPos + 1) = "�" Case &H0E30, &H0E47 TempTranslit = Chr(181) 'ae arrChars(nPos + 1) = "�" End Select Case &H0E42 TempTranslit = "o" & Chr(229) 'o-macron Select Case nNextHex Case &H0E22 TempTranslit = "o" & Chr(229) & "i" 'o-macron-i arrChars(nPos + 1) = "�" Case &H0E30 TempTranslit = "o" arrChars(nPos + 1) = "�" End Select Case &H0E43 TempTranslit = "ai" Case &H0E44 TempTranslit = "ai" Select Case nNextHex Case &H0E22 TempTranslit = "ai" arrChars(nPos + 1) = "�" End Select Case Else 'Unknown/non-Thai character TempTranslit= Chr(252) End Select Select Case nNextHex Case &HE4C 'Thanthakhat TempTranslit = "" arrChars(nPos + 1) = "�" End Select If IsConsonant = 1 Then 'If nNextHex = &H093C And UBound(arrChars) > nPos + 1 Then ' sNextHex = Mid(arrChars(nPos+2), 4, Len(arrChars(nPos+2)) - 1) ' nNextHex = Val("&H" & sNextHex) 'End If Select Case nNextHex Case &H0E24, &H0E26, &H0E30 To &H0E39, &H0E40 To &H0E44 'Do nothing; vowel follows Case &H0E27 If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ย" Then 'Do nothing; vowel follows Else If sCharType = "F" Then 'Do nothing; final consonant Else 'Add the implicit "a" TempTranslit = TempTranslit & "a" End If End If Else If sCharType = "F" Then 'Do nothing; final consonant Else 'Add the implicit "a" TempTranslit = TempTranslit & "a" End If End If Case &H0E2D If nPos + 2 <= UBound(arrChars) Then If arrChars(nPos + 2) = "ย" Then 'Do nothing; vowel follows Else If sCharType = "F" Then 'Do nothing; final consonant Else 'Add the implicit "a" TempTranslit = TempTranslit & "a" End If End If Else If sCharType = "F" Then 'Do nothing; final consonant Else 'Add the implicit "a" TempTranslit = TempTranslit & "a" End If End If Case &H0E3A 'Do nothing; second consonant follows Case Else If sCharType = "F" Then 'Do nothing; final consonant Else 'Add the implicit "a" TempTranslit = TempTranslit & "a" End If End Select End If If nSkipChar > 0 Then j = 1 Do arrChars(nPos + j) = "�" j = j + 1 Loop While j <= nSkipChar nSkipChar = 0 End If TransThai = TempTranslit End Function '############################################################################## Function IsThaiChar(sNCR) As Integer Dim b b = Mid(sNCR, 1, 6) If Len(sNCR) = 6 And (Mid(sNCR, 1, 6) Like "&[#]x0E[0-5]") Then IsThaiChar = 1 Else IsThaiChar = 0 End If End Function