Android Question How to code Sql commands to sort the result which is non-English?

Theera

Well-Known Member
Licensed User
Longtime User
Refer to Alexeder's code as belows
B4X:
    'SQL query based on the search text
    Dim DR As ResultSet = sql1.ExecQuery2("SELECT * FROM dt_Country WHERE name LIKE ? ORDER BY name ASC",Array As String("%" & SearchText & "%"))

"ORDER BY name ASC" it can used only English, If I need to test my language(Thai) ,How to code?
 

emexes

Expert
Licensed User
I have problem how to code continue (after sorted)

Use something like this to test your country name to sort string function:

B4X:
Sub Process_Globals
    Type CountryType(EnglishName As String, ThaiName As String, ThaiSortCode As String)    
End Sub

Sub ThaiSortCode(ThaiName As String) As String
    Return (100 + ThaiName.Length) & " " & ThaiName    'dummy example to generate thai sort code from thai name    
End Sub

Sub AppStart (Args() As String)

    Dim TestCountries() As String = Array As String( _
        "English",   "Thai", _
        "Malaysia",  "มาเลเซีย", _
        "Canada",    "แคนาดา", _
        "Germany",   "เยอรมนี", _
        "Thailand",  "ไทย", _
        "UK",        "สหราชอาณาจักร", _
        "Spain",     "สเปน", _
        "France",    "ฝรั่งเศส", _
        "USA",       "สหรัฐอเมริกา", _
        "Israel",    "อิสราเอล", _
        "Italy",     "อิตาลี", _
        "Australia", "ออสเตรเลีย" _
    )

    Dim MyList As List
    MyList.Initialize

    For I = 2 To TestCountries.Length - 1 Step 2
        Dim Country As CountryType
        Country.EnglishName = TestCountries(I)
        Country.ThaiName = TestCountries(I + 1)
        Country.ThaiSortCode = ThaiSortCode(Country.ThaiName)    
        MyList.Add(Country)
    Next

    For Each SortField As String In Array As String("EnglishName", "ThaiName", "ThaiSortCode")
        MyList.SortType(SortField, True)
        
        Log(Chr(160))    'blank line
        Log("===== Countries sorted by " & SortField & " field =====")
        For Each C As CountryType In MyList
            Log(C.EnglishName & TAB & C.ThaiName & TAB & C.ThaiSortCode)
        Next
    Next

End Sub
Log output:
Waiting for debugger to connect...
Program started.
 
===== Countries sorted by EnglishName field =====
Australia    ออสเตรเลีย    110 ออสเตรเลีย
Canada    แคนาดา    106 แคนาดา
France    ฝรั่งเศส    108 ฝรั่งเศส
Germany    เยอรมนี    107 เยอรมนี
Israel    อิสราเอล    108 อิสราเอล
Italy    อิตาลี    106 อิตาลี
Malaysia    มาเลเซีย    108 มาเลเซีย
Spain    สเปน    104 สเปน
Thailand    ไทย    103 ไทย
UK    สหราชอาณาจักร    113 สหราชอาณาจักร
USA    สหรัฐอเมริกา    112 สหรัฐอเมริกา
 
===== Countries sorted by ThaiName field =====
France    ฝรั่งเศส    108 ฝรั่งเศส
Malaysia    มาเลเซีย    108 มาเลเซีย
USA    สหรัฐอเมริกา    112 สหรัฐอเมริกา
UK    สหราชอาณาจักร    113 สหราชอาณาจักร
Spain    สเปน    104 สเปน
Australia    ออสเตรเลีย    110 ออสเตรเลีย
Italy    อิตาลี    106 อิตาลี
Israel    อิสราเอล    108 อิสราเอล
Germany    เยอรมนี    107 เยอรมนี
Canada    แคนาดา    106 แคนาดา
Thailand    ไทย    103 ไทย
 
===== Countries sorted by ThaiSortCode field =====
Thailand    ไทย    103 ไทย
Spain    สเปน    104 สเปน
Italy    อิตาลี    106 อิตาลี
Canada    แคนาดา    106 แคนาดา
Germany    เยอรมนี    107 เยอรมนี
France    ฝรั่งเศส    108 ฝรั่งเศส
Malaysia    มาเลเซีย    108 มาเลเซีย
Israel    อิสราเอล    108 อิสราเอล
Australia    ออสเตรเลีย    110 ออสเตรเลีย
USA    สหรัฐอเมริกา    112 สหรัฐอเมริกา
UK    สหราชอาณาจักร    113 สหราชอาณาจักร
 
Last edited:
Upvote 0

emexes

Expert
Licensed User
It uses a list that has three "columns" aka fields, as defined in the CountryType UDT (User Defined Type)

The "columns" aka fields are called: EnglishName, ThaiName, and ThaiSortCode

In retrospect it would have been better to call them: EnglishName, ThaiName, and ThaiSortCode fixed! 🤫

It goes through the list of test countries, and for each country: creates a list element and fills in the "missing" third field by calling a function that turns a ThaiName into a ThaiSortCode, and then adds the three-field element to MyList.

Then it sorts and displays MyList three times:
1/ first time sorted by the first column (English name),
2/ second time sorted by the second column (Thai name), and
3/ third time sorted by the third column (ThaiSortCode, as created by the ThaiName-to-ThaiSortCode function).

Again, I'm leaving the bit that needs Thai language knowlege, for the expert... 🙃
 
Last edited:
Upvote 0

Theera

Well-Known Member
Licensed User
Longtime User
Use something like this to test your country name to sort string function:

B4X:
Sub Process_Globals
    Type CountryType(English As String, Thai As String, ThaiSortCode As String)   
End Sub

Sub ThaiSortCode(Thai As String) As String
    Return Rnd(100, 200) & " " & Thai    'dummy example to generate thai sort code from thai name   
End Sub

Sub AppStart (Args() As String)

    Dim Countries() As String = Array As String( _
        "English",   "Thai", _
        "Malaysia",  "มาเลเซีย", _
        "Canada",    "แคนาดา", _
        "Germany",   "เยอรมนี", _
        "Thailand",  "ไทย", _
        "UK",        "สหราชอาณาจักร", _
        "Spain",     "สเปน", _
        "France",    "ฝรั่งเศส", _
        "USA",       "สหรัฐอเมริกา", _
        "Israel",    "อิสราเอล", _
        "Italy",     "อิตาลี", _
        "Australia", "ออสเตรเลีย" _
    )

    Dim MyList As List
    MyList.Initialize

    For I = 2 To Countries.Length - 1 Step 2
        Dim Country As CountryType
        Country.English = Countries(I)
        Country.Thai = Countries(I + 1)
        Country.ThaiSortCode = ThaiSortCode(Country.Thai)   
        MyList.Add(Country)
    Next

    For Each SF As String In Array As String("English", "Thai", "ThaiSortCode")
        MyList.SortType(SF, True)
        
        Log(Chr(160))    'blank line
        Log("===== Countries sorted by " & SF & " field =====")
        For Each C As CountryType In MyList
            Log(C.English & TAB & C.Thai & TAB & C.ThaiSortCode)
        Next
    Next

End Sub
Log output:
Waiting for debugger to connect...
Program started.
 
===== Countries sorted by English field =====
Australia    ออสเตรเลีย    134 ออสเตรเลีย
Canada    แคนาดา    195 แคนาดา
France    ฝรั่งเศส    166 ฝรั่งเศส
Germany    เยอรมนี    104 เยอรมนี
Israel    อิสราเอล    168 อิสราเอล
Italy    อิตาลี    196 อิตาลี
Malaysia    มาเลเซีย    185 มาเลเซีย
Spain    สเปน    146 สเปน
Thailand    ไทย    195 ไทย
UK    สหราชอาณาจักร    196 สหราชอาณาจักร
USA    สหรัฐอเมริกา    197 สหรัฐอเมริกา
 
===== Countries sorted by Thai field =====
France    ฝรั่งเศส    166 ฝรั่งเศส
Malaysia    มาเลเซีย    185 มาเลเซีย
USA    สหรัฐอเมริกา    197 สหรัฐอเมริกา
UK    สหราชอาณาจักร    196 สหราชอาณาจักร
Spain    สเปน    146 สเปน
Australia    ออสเตรเลีย    134 ออสเตรเลีย
Italy    อิตาลี    196 อิตาลี
Israel    อิสราเอล    168 อิสราเอล
Germany    เยอรมนี    104 เยอรมนี
Canada    แคนาดา    195 แคนาดา
Thailand    ไทย    195 ไทย
 
===== Countries sorted by ThaiSortCode field =====
Germany    เยอรมนี    104 เยอรมนี
Australia    ออสเตรเลีย    134 ออสเตรเลีย
Spain    สเปน    146 สเปน
France    ฝรั่งเศส    166 ฝรั่งเศส
Israel    อิสราเอล    168 อิสราเอล
Malaysia    มาเลเซีย    185 มาเลเซีย
Canada    แคนาดา    195 แคนาดา
Thailand    ไทย    195 ไทย
UK    สหราชอาณาจักร    196 สหราชอาณาจักร
Italy    อิตาลี    196 อิตาลี
USA    สหรัฐอเมริกา    197 สหรัฐอเมริกา
Thank you for your replies, but it still be not correct. I will come back on Tuesday because I have to go to court. To decide the lawsuit in the case of a fatal car crash which I did not commit.(mycar is red)
 

Attachments

  • Screenshot_20250105_130842.png
    Screenshot_20250105_130842.png
    148.8 KB · Views: 21
Upvote 0

emexes

Expert
Licensed User
I will come back on Tuesday

👍

I don't know what you call that motorcycle's manoeuvre in Thai, but in English Australian we call it threading traffic or threading the lane. And every time I see a motorcyclist do it, I think "good luck, mate, that trick is going to bite you one day".

There are brave motorcyclists and there are old motorcyclists but there are no old brave motorcyclists.
 
Upvote 0

emexes

Expert
Licensed User
Grok did most of the hard work, I just gave it a bit of a polish, but... magic! :

B4X:
Sub Process_Globals
    Type FourStringsType(Original As String, English As String, Thai As String, ThaiSortCode As String)

    ' Define constants for Thai characters
    Private SARA_E As Int = 0x0E40
    Private SARA_AI_MAIMALAI As Int = 0x0E44
    Private MAITAIKHU As Int = 0x0E47
    Private THANTHAKHAT As Int = 0x0E4C
End Sub

' Function to check if a character is a leading vowel
Private Sub IsLeadingVowel(C As Char) As Boolean
    Dim CodePoint As Int = Asc(c)
    Return CodePoint >= SARA_E And CodePoint <= SARA_AI_MAIMALAI
End Sub

' Function to check if a character is a tone mark
Private Sub IsToneMark(C As Char) As Boolean
    Dim CodePoint As Int = Asc(c)
    Return CodePoint >= MAITAIKHU And CodePoint <= THANTHAKHAT
End Sub

' Function to get a Thai comparison string
Private Sub GetThaiComparisonString(s As String) As String
    '''Dim chars() As Char = s.ToCharArray
    Dim chars(s.Length) As Char
    For I = 0 To s.Length - 1
        chars(I) = s.CharAt(I)
    Next
 
    ' Swap all leading vowels with the next character
    For i = 0 To chars.Length - 2 ' -2 because we're swapping two chars at once
        If IsLeadingVowel(chars(i)) Then
            Dim temp As Char = chars(i)
            chars(i) = chars(i + 1)
            chars(i + 1) = temp
            i = i + 1 ' Skip the next character since it's been swapped
        End If
    Next

    Dim head As String = ""
    Dim tail As String = "00"

    ' Build comparison string
    For i = 0 To chars.Length - 1
        If IsToneMark(chars(i)) Then
            Dim pos As Int = chars.Length - i
            If pos >= 10 Then
                tail = tail & pos
            Else
                tail = tail & "0" & pos
            End If
            tail = tail & chars(i)
        Else
            head = head & chars(i)
        End If
    Next

    Return head & tail
End Sub

Sub AppStart (Args() As String)

    Dim TestData() As String = Array As String( _
        "English",        "Thai",        _
        "go",            "โก",        _
        "go",            "โก่",        _
        "stylish",        "โก้",        _
        "gangster",        "โก๋",        _
        "sickle",        "เคียว",        _
        "stir",            "เคี่ยว",        _
        "chew",            "เคี้ยว",        _
        "support",        "จุน",        _
        "poke",            "จุ่น",        _
        "touch",        "จุ้น",        _
        "throw",        "ปา",        _
        "forest",        "ป่า",        _
        "aunt",            "ป้า",        _
        "dad",            "ป๋า",        _
        "cliff",        "ผา",        _
        "cut",            "ผ่า",        _
        "cloth",        "ผ้า",        _
        "play",            "เลน",        _
        "play",            "เล็น",        _
        "play",            "เล่น",        _
        "shimmer",        "วาว",        _
        "kite",            "ว่าว",        _
        "wow",            "ว้าว",        _
        "yuck",            "โอ้ก",        _
        "yuck",            "โอ๊ก",        _
        "noodle soup",    "กวยจั๊บ",        _
        "noodle soup",    "ก๋วยจับ",        _
        "noodles",        "ก๊วยเตี๋ยว",    _
        "noodles",        "ก๋วยเตี๋ยว",    _
        "bitter",        "ขมขื่น",        _
        "rape",            "ข่มขืน",        _
        "gold-plated",    "ลงทอง",        _
        "settle down",    "ลงท้อง",        _
        "empty",        "โล่งโต้ง",        _
        "empty",        "โล้งโต้ง"        _
    )

    Dim MyList As List
    MyList.Initialize

    For I = 2 To TestData.Length - 1 Step 2
        Dim FourStrings As FourStringsType
        FourStrings.Original = NumberFormat(I / 2, 2, 0)
        FourStrings.English = TestData(I)
        FourStrings.Thai = TestData(I + 1)
        FourStrings.ThaiSortCode = GetThaiComparisonString(FourStrings.Thai)
        MyList.Add(FourStrings)
    Next

    For Each SortField As String In Array As String("Original", "English", "Thai", "ThaiSortCode")
        MyList.SortType(SortField, True)
    
        Log(Chr(160))    'blank line
        Log("===== Sorted by " & SortField & " field =====")
        For Each FS As FourStringsType In MyList
            Log(LSET(FS.Original, 10) & LSET(FS.English, 20) & LSET(FS.Thai, 20) & FS.ThaiSortCode)
        Next
    Next

End Sub

' function to pad a string to a specified length with spaces
Sub LSET(S As String, L As Int) As String
 
    Dim Temp As String = S
 
    Do While Temp.Length < L
        Temp = Temp & " "
    Loop

    Return Temp
 
End Sub

Log output:
Waiting for debugger to connect...
Program started.
 
===== Sorted by Original field =====
01        go                  โก                  กโ00
02        go                  โก่                 กโ0001่
03        stylish             โก้                 กโ0001้
04        gangster            โก๋                 กโ0001๋
05        sickle              เคียว               คเียว00
06        stir                เคี่ยว              คเียว0003่
07        chew                เคี้ยว              คเียว0003้
08        support             จุน                 จุน00
09        poke                จุ่น                จุน0002่
10        touch               จุ้น                จุน0002้
11        throw               ปา                  ปา00
12        forest              ป่า                 ปา0002่
13        aunt                ป้า                 ปา0002้
14        dad                 ป๋า                 ปา0002๋
15        cliff               ผา                  ผา00
16        cut                 ผ่า                 ผา0002่
17        cloth               ผ้า                 ผา0002้
18        play                เลน                 ลเน00
19        play                เล็น                ลเน0002็
20        play                เล่น                ลเน0002่
21        shimmer             วาว                 วาว00
22        kite                ว่าว                วาว0003่
23        wow                 ว้าว                วาว0003้
24        yuck                โอ้ก                อโก0002้
25        yuck                โอ๊ก                อโก0002๊
26        noodle soup         กวยจั๊บ             กวยจับ0002๊
27        noodle soup         ก๋วยจับ             กวยจับ0006๋
28        noodles             ก๊วยเตี๋ยว          กวยตเียว0009๊03๋
29        noodles             ก๋วยเตี๋ยว          กวยตเียว0009๋03๋
30        bitter              ขมขื่น              ขมขืน0002่
31        rape                ข่มขืน              ขมขืน0005่
32        gold-plated         ลงทอง               ลงทอง00
33        settle down         ลงท้อง              ลงทอง0003้
34        empty               โล่งโต้ง            ลโงตโง0006่02้
35        empty               โล้งโต้ง            ลโงตโง0006้02้
 
===== Sorted by English field =====
13        aunt                ป้า                 ปา0002้
30        bitter              ขมขื่น              ขมขืน0002่
07        chew                เคี้ยว              คเียว0003้
15        cliff               ผา                  ผา00
17        cloth               ผ้า                 ผา0002้
16        cut                 ผ่า                 ผา0002่
14        dad                 ป๋า                 ปา0002๋
34        empty               โล่งโต้ง            ลโงตโง0006่02้
35        empty               โล้งโต้ง            ลโงตโง0006้02้
12        forest              ป่า                 ปา0002่
04        gangster            โก๋                 กโ0001๋
01        go                  โก                  กโ00
02        go                  โก่                 กโ0001่
32        gold-plated         ลงทอง               ลงทอง00
22        kite                ว่าว                วาว0003่
26        noodle soup         กวยจั๊บ             กวยจับ0002๊
27        noodle soup         ก๋วยจับ             กวยจับ0006๋
28        noodles             ก๊วยเตี๋ยว          กวยตเียว0009๊03๋
29        noodles             ก๋วยเตี๋ยว          กวยตเียว0009๋03๋
18        play                เลน                 ลเน00
19        play                เล็น                ลเน0002็
20        play                เล่น                ลเน0002่
09        poke                จุ่น                จุน0002่
31        rape                ข่มขืน              ขมขืน0005่
33        settle down         ลงท้อง              ลงทอง0003้
21        shimmer             วาว                 วาว00
05        sickle              เคียว               คเียว00
06        stir                เคี่ยว              คเียว0003่
03        stylish             โก้                 กโ0001้
08        support             จุน                 จุน00
11        throw               ปา                  ปา00
10        touch               จุ้น                จุน0002้
23        wow                 ว้าว                วาว0003้
24        yuck                โอ้ก                อโก0002้
25        yuck                โอ๊ก                อโก0002๊
 
===== Sorted by Thai field =====
26        noodle soup         กวยจั๊บ             กวยจับ0002๊
28        noodles             ก๊วยเตี๋ยว          กวยตเียว0009๊03๋
27        noodle soup         ก๋วยจับ             กวยจับ0006๋
29        noodles             ก๋วยเตี๋ยว          กวยตเียว0009๋03๋
30        bitter              ขมขื่น              ขมขืน0002่
31        rape                ข่มขืน              ขมขืน0005่
08        support             จุน                 จุน00
09        poke                จุ่น                จุน0002่
10        touch               จุ้น                จุน0002้
11        throw               ปา                  ปา00
12        forest              ป่า                 ปา0002่
13        aunt                ป้า                 ปา0002้
14        dad                 ป๋า                 ปา0002๋
15        cliff               ผา                  ผา00
16        cut                 ผ่า                 ผา0002่
17        cloth               ผ้า                 ผา0002้
32        gold-plated         ลงทอง               ลงทอง00
33        settle down         ลงท้อง              ลงทอง0003้
21        shimmer             วาว                 วาว00
22        kite                ว่าว                วาว0003่
23        wow                 ว้าว                วาว0003้
05        sickle              เคียว               คเียว00
06        stir                เคี่ยว              คเียว0003่
07        chew                เคี้ยว              คเียว0003้
18        play                เลน                 ลเน00
19        play                เล็น                ลเน0002็
20        play                เล่น                ลเน0002่
01        go                  โก                  กโ00
02        go                  โก่                 กโ0001่
03        stylish             โก้                 กโ0001้
04        gangster            โก๋                 กโ0001๋
34        empty               โล่งโต้ง            ลโงตโง0006่02้
35        empty               โล้งโต้ง            ลโงตโง0006้02้
24        yuck                โอ้ก                อโก0002้
25        yuck                โอ๊ก                อโก0002๊
 
===== Sorted by ThaiSortCode field =====
26        noodle soup         กวยจั๊บ             กวยจับ0002๊
27        noodle soup         ก๋วยจับ             กวยจับ0006๋
28        noodles             ก๊วยเตี๋ยว          กวยตเียว0009๊03๋
29        noodles             ก๋วยเตี๋ยว          กวยตเียว0009๋03๋
01        go                  โก                  กโ00
02        go                  โก่                 กโ0001่
03        stylish             โก้                 กโ0001้
04        gangster            โก๋                 กโ0001๋
30        bitter              ขมขื่น              ขมขืน0002่
31        rape                ข่มขืน              ขมขืน0005่
05        sickle              เคียว               คเียว00
06        stir                เคี่ยว              คเียว0003่
07        chew                เคี้ยว              คเียว0003้
08        support             จุน                 จุน00
09        poke                จุ่น                จุน0002่
10        touch               จุ้น                จุน0002้
11        throw               ปา                  ปา00
12        forest              ป่า                 ปา0002่
13        aunt                ป้า                 ปา0002้
14        dad                 ป๋า                 ปา0002๋
15        cliff               ผา                  ผา00
16        cut                 ผ่า                 ผา0002่
17        cloth               ผ้า                 ผา0002้
32        gold-plated         ลงทอง               ลงทอง00
33        settle down         ลงท้อง              ลงทอง0003้
18        play                เลน                 ลเน00
19        play                เล็น                ลเน0002็
20        play                เล่น                ลเน0002่
34        empty               โล่งโต้ง            ลโงตโง0006่02้
35        empty               โล้งโต้ง            ลโงตโง0006้02้
21        shimmer             วาว                 วาว00
22        kite                ว่าว                วาว0003่
23        wow                 ว้าว                วาว0003้
24        yuck                โอ้ก                อโก0002้
25        yuck                โอ๊ก                อโก0002๊
 
Last edited:
Upvote 0

Theera

Well-Known Member
Licensed User
Longtime User
Hi emexes,
Your code is more complex,it's diffcult to learn the code for me. I don't know how to sort the data. it's about FourStringType,I think that it's complex
 

Attachments

  • TestSortThaiWords2.zip
    10.7 KB · Views: 0
Upvote 0

emexes

Expert
Licensed User
I don't know how to sort the data.

Is the Thai writing here, in the third column, sorted correctly? :

Log output:
===== Sorted by ThaiSortCode field =====
26        noodle soup         กวยจั๊บ             กวยจับ0002๊
27        noodle soup         ก๋วยจับ             กวยจับ0006๋
28        noodles             ก๊วยเตี๋ยว          กวยตเียว0009๊03๋
29        noodles             ก๋วยเตี๋ยว          กวยตเียว0009๋03๋
01        go                  โก                  กโ00
02        go                  โก่                 กโ0001่
03        stylish             โก้                 กโ0001้
04        gangster            โก๋                 กโ0001๋
30        bitter              ขมขื่น              ขมขืน0002่
31        rape                ข่มขืน              ขมขืน0005่
05        sickle              เคียว               คเียว00
06        stir                เคี่ยว              คเียว0003่
07        chew                เคี้ยว              คเียว0003้
08        support             จุน                 จุน00
09        poke                จุ่น                จุน0002่
10        touch               จุ้น                จุน0002้
11        throw               ปา                  ปา00
12        forest              ป่า                 ปา0002่
13        aunt                ป้า                 ปา0002้
14        dad                 ป๋า                 ปา0002๋
15        cliff               ผา                  ผา00
16        cut                 ผ่า                 ผา0002่
17        cloth               ผ้า                 ผา0002้
32        gold-plated         ลงทอง               ลงทอง00
33        settle down         ลงท้อง              ลงทอง0003้
18        play                เลน                 ลเน00
19        play                เล็น                ลเน0002็
20        play                เล่น                ลเน0002่
34        empty               โล่งโต้ง            ลโงตโง0006่02้
35        empty               โล้งโต้ง            ลโงตโง0006้02้
21        shimmer             วาว                 วาว00
22        kite                ว่าว                วาว0003่
23        wow                 ว้าว                วาว0003้
24        yuck                โอ้ก                อโก0002้
25        yuck                โอ๊ก                อโก0002๊
 
Upvote 0

Theera

Well-Known Member
Licensed User
Longtime User
Is the Thai writing here, in the third column, sorted correctly? :

Log output:
===== Sorted by ThaiSortCode field =====
26        noodle soup         กวยจั๊บ             กวยจับ0002๊
27        noodle soup         ก๋วยจับ             กวยจับ0006๋
28        noodles             ก๊วยเตี๋ยว          กวยตเียว0009๊03๋
29        noodles             ก๋วยเตี๋ยว          กวยตเียว0009๋03๋
01        go                  โก                  กโ00
02        go                  โก่                 กโ0001่
03        stylish             โก้                 กโ0001้
04        gangster            โก๋                 กโ0001๋
30        bitter              ขมขื่น              ขมขืน0002่
31        rape                ข่มขืน              ขมขืน0005่
05        sickle              เคียว               คเียว00
06        stir                เคี่ยว              คเียว0003่
07        chew                เคี้ยว              คเียว0003้
08        support             จุน                 จุน00
09        poke                จุ่น                จุน0002่
10        touch               จุ้น                จุน0002้
11        throw               ปา                  ปา00
12        forest              ป่า                 ปา0002่
13        aunt                ป้า                 ปา0002้
14        dad                 ป๋า                 ปา0002๋
15        cliff               ผา                  ผา00
16        cut                 ผ่า                 ผา0002่
17        cloth               ผ้า                 ผา0002้
32        gold-plated         ลงทอง               ลงทอง00
33        settle down         ลงท้อง              ลงทอง0003้
18        play                เลน                 ลเน00
19        play                เล็น                ลเน0002็
20        play                เล่น                ลเน0002่
34        empty               โล่งโต้ง            ลโงตโง0006่02้
35        empty               โล้งโต้ง            ลโงตโง0006้02้
21        shimmer             วาว                 วาว00
22        kite                ว่าว                วาว0003่
23        wow                 ว้าว                วาว0003้
24        yuck                โอ้ก                อโก0002้
25        yuck                โอ๊ก                อโก0002๊
Your code is correct, but I can't learn yourcode, so it make me be confused.
 
Upvote 0

aeric

Expert
Licensed User
Longtime User
It's tricky to sort non-English text.
I don't think SQLite is suitable. Try use database that support Collation of your language.
I would prefer a simple way of sorting using a sequence column in my table for sorting if the list is not long.
 
Upvote 0

emexes

Expert
Licensed User
I think that I must create a new list

Well, that is one way of doing it.

But another is that I see your SQL table is called dt_Country, which sounds like a list of the ~200 countries of the world, that doesn't change very often, and is only changed by you, ie not changed by the end user.

So if you are in control of that SQL table, why not add another column to it, called "sortnumber", and prefill that column just like you already have prefilled the "name" column, with numbers from 1..200 in Thai country name order, eg:

B4X:
Sub AppStart (Args() As String)

    ' https://x.com/i/grok/share/9oPOa9H4oWNt6arRshgetbXF7
    
    Dim TestData() As String = Array As String( _
        "English", "Thai", _
        "Afghanistan", "อัฟกานิสถาน", _
        "Albania", "แอลเบเนีย", _
        "Algeria", "แอลจีเรีย", _
        "Andorra", "อันดอร์รา", _
        "Angola", "แองโกลา", _
        "Antigua and Barbuda", "แอนทิกาและบาร์บูดา", _
        "Argentina", "อาร์เจนตินา", _
        "Armenia", "อาร์มีเนีย", _
        "Australia", "ออสเตรเลีย", _
        "Austria", "ออสเตรีย", _
        "Azerbaijan", "อาเซอร์ไบจาน", _
        "Bahamas", "บาฮามาส", _
        "Bahrain", "บาห์เรน", _
        "Bangladesh", "บังกลาเทศ", _
        "Barbados", "บาร์เบโดส", _
        "Belarus", "เบลารุส", _
        "Belgium", "เบลเยียม", _
        "Belize", "เบลีซ", _
        "Benin", "เบนิน", _
        "Bhutan", "ภูฏาน", _
        "Bolivia", "โบลิเวีย", _
        "Bosnia and Herzegovina", "บอสเนียและเฮอร์เซโกวีนา", _
        "Botswana", "บอตสวานา", _
        "Brazil", "บราซิล", _
        "Brunei", "บรูไน", _
        "Bulgaria", "บัลแกเรีย", _
        "Burkina Faso", "บูร์กินาฟาโซ", _
        "Burundi", "บุรุนดี", _
        "Cabo Verde", "กาบูเวร์ดี", _
        "Cambodia", "กัมพูชา", _
        "Cameroon", "แคเมอรูน", _
        "Canada", "แคนาดา", _
        "Central African Republic", "สาธารณรัฐแอฟริกากลาง", _
        "Chad", "ชาด", _
        "Chile", "ชิลี", _
        "China", "จีน", _
        "Colombia", "โคลัมเบีย", _
        "Comoros", "คอโมโรส", _
        "Congo (Democratic Republic of the)", "สาธารณรัฐประชาธิปไตยคองโก", _
        "Congo (Republic of the)", "สาธารณรัฐคองโก", _
        "Costa Rica", "คอสตาริกา", _
        "Côte d'Ivoire", "โกตดิวัวร์", _
        "Croatia", "โครเอเชีย", _
        "Cuba", "คิวบา", _
        "Cyprus", "ไซปรัส", _
        "Czech Republic", "สาธารณรัฐเช็ก", _
        "Denmark", "เดนมาร์ก", _
        "Djibouti", "จิบูตี", _
        "Dominica", "โดมินีกา", _
        "Dominican Republic", "สาธารณรัฐโดมินิกัน", _
        "Ecuador", "เอกวาดอร์", _
        "Egypt", "อียิปต์", _
        "El Salvador", "เอลซัลวาดอร์", _
        "Equatorial Guinea", "อิเควทอเรียลกินี", _
        "Eritrea", "เอริเทรีย", _
        "Estonia", "เอสโตเนีย", _
        "Eswatini", "เอสวาตีนี", _
        "Ethiopia", "เอธิโอเปีย", _
        "Fiji", "ฟีจิ", _
        "Finland", "ฟินแลนด์", _
        "France", "ฝรั่งเศส", _
        "Gabon", "กาบอง", _
        "Gambia", "แกมเบีย", _
        "Georgia", "จอร์เจีย", _
        "Germany", "เยอรมนี", _
        "Ghana", "กานา", _
        "Greece", "กรีซ", _
        "Grenada", "เกรเนดา", _
        "Guatemala", "กัวเตมาลา", _
        "Guinea", "กินี", _
        "Guinea-Bissau", "กินี-บิสเซา", _
        "Guyana", "กายอานา", _
        "Haiti", "เฮติ", _
        "Honduras", "ฮอนดูรัส", _
        "Hungary", "ฮังการี", _
        "Iceland", "ไอซ์แลนด์", _
        "India", "อินเดีย", _
        "Indonesia", "อินโดนีเซีย", _
        "Iran", "อิหร่าน", _
        "Iraq", "อิรัก", _
        "Ireland", "ไอร์แลนด์", _
        "Israel", "อิสราเอล", _
        "Italy", "อิตาลี", _
        "Jamaica", "จาเมกา", _
        "Japan", "ญี่ปุ่น", _
        "Jordan", "จอร์แดน", _
        "Kazakhstan", "คาซัคสถาน", _
        "Kenya", "เคนยา", _
        "Kiribati", "คิริบาส", _
        "Korea (North)", "เกาหลีเหนือ", _
        "Korea (South)", "เกาหลีใต้", _
        "Kosovo", "โคโซโว", _
        "Kuwait", "คูเวต", _
        "Kyrgyzstan", "คีร์กีซสถาน", _
        "Laos", "ลาว", _
        "Latvia", "ลัตเวีย", _
        "Lebanon", "เลบานอน", _
        "Lesotho", "เลโซโท", _
        "Liberia", "ไลบีเรีย", _
        "Libya", "ลิเบีย", _
        "Liechtenstein", "ลิกเตนสไตน์", _
        "Lithuania", "ลิทัวเนีย", _
        "Luxembourg", "ลักเซมเบิร์ก", _
        "Madagascar", "มาดากัสการ์", _
        "Malawi", "มาลาวี", _
        "Malaysia", "มาเลเซีย", _
        "Maldives", "มัลดีฟส์", _
        "Mali", "มาลี", _
        "Malta", "มอลตา", _
        "Marshall Islands", "หมู่เกาะมาร์แชลล์", _
        "Mauritania", "มอริเตเนีย", _
        "Mauritius", "มอริเชียส", _
        "Mexico", "เม็กซิโก", _
        "Micronesia", "ไมโครนีเชีย", _
        "Moldova", "มอลโดวา", _
        "Monaco", "โมนาโก", _
        "Mongolia", "มองโกเลีย", _
        "Montenegro", "มอนเตเนโกร", _
        "Morocco", "โมร็อกโก", _
        "Mozambique", "โมซัมบิก", _
        "Myanmar", "พม่า", _
        "Namibia", "นามิเบีย", _
        "Nauru", "นาอูรู", _
        "Nepal", "เนปาล", _
        "Netherlands", "เนเธอร์แลนด์", _
        "New Zealand", "นิวซีแลนด์", _
        "Nicaragua", "นิการากัว", _
        "Niger", "ไนเจอร์", _
        "Nigeria", "ไนจีเรีย", _
        "North Macedonia", "มาซิโดเนียเหนือ", _
        "Norway", "นอร์เวย์", _
        "Oman", "โอมาน", _
        "Pakistan", "ปากีสถาน", _
        "Palau", "ปาเลา", _
        "Panama", "ปานามา", _
        "Papua New Guinea", "ปาปัวนิวกินี", _
        "Paraguay", "ปารากวัย", _
        "Peru", "เปรู", _
        "Philippines", "ฟิลิปปินส์", _
        "Poland", "โปแลนด์", _
        "Portugal", "โปรตุเกส", _
        "Qatar", "กาตาร์", _
        "Romania", "โรมาเนีย", _
        "Russia", "รัสเซีย", _
        "Rwanda", "รวันดา", _
        "Saint Kitts and Nevis", "เซนต์คิตส์และเนวิส", _
        "Saint Lucia", "เซนต์ลูเชีย", _
        "Saint Vincent and the Grenadines", "เซนต์วินเซนต์และเกรนาดีนส์", _
        "Samoa", "ซามัว", _
        "San Marino", "ซานมารีโน", _
        "São Tomé and Príncipe", "เซาตูเมและปรินซีปี", _
        "Saudi Arabia", "ซาอุดีอาระเบีย", _
        "Senegal", "เซเนกัล", _
        "Serbia", "เซอร์เบีย", _
        "Seychelles", "เซเชลส์", _
        "Sierra Leone", "เซียร์ราลีโอน", _
        "Singapore", "สิงคโปร์", _
        "Slovakia", "สโลวาเกีย", _
        "Slovenia", "สโลวีเนีย", _
        "Solomon Islands", "หมู่เกาะโซโลมอน", _
        "Somalia", "โซมาเลีย", _
        "South Africa", "แอฟริกาใต้", _
        "South Sudan", "ซูดานใต้", _
        "Spain", "สเปน", _
        "Sri Lanka", "ศรีลังกา", _
        "Sudan", "ซูดาน", _
        "Suriname", "ซูรินาม", _
        "Sweden", "สวีเดน", _
        "Switzerland", "สวิตเซอร์แลนด์", _
        "Syria", "ซีเรีย", _
        "Tajikistan", "ทาจิกิสถาน", _
        "Tanzania", "แทนซาเนีย", _
        "Thailand", "ไทย", _
        "Timor-Leste", "ติมอร์-เลสเต", _
        "Togo", "โตโก", _
        "Tonga", "ตองงา", _
        "Trinidad and Tobago", "ตรินิแดดและโตเบโก", _
        "Tunisia", "ตูนิเซีย", _
        "Turkey", "ตุรกี", _
        "Turkmenistan", "เติร์กเมนิสถาน", _
        "Tuvalu", "ตูวาลู", _
        "Uganda", "ยูกันดา", _
        "Ukraine", "ยูเครน", _
        "United Arab Emirates", "สหรัฐอาหรับเอมิเรตส์", _
        "United Kingdom", "สหราชอาณาจักร", _
        "United States", "สหรัฐอเมริกา", _
        "Uruguay", "อุรุกวัย", _
        "Uzbekistan", "อุซเบกิสถาน", _
        "Vanuatu", "วานูอาตู", _
        "Vatican City", "นครวาติกัน", _
        "Venezuela", "เวเนซุเอลา", _
        "Vietnam", "เวียดนาม", _
        "Yemen", "เยเมน", _
        "Zambia", "แซมเบีย", _
        "Zimbabwe", "ซิมบับเว" _
    )   
    
    Dim MyList As List
    MyList.Initialize

    For I = 2 To TestData.Length - 1 Step 2
        Dim FourStrings As FourStringsType
        FourStrings.Original = NumberFormat(I / 2, 2, 0)
        FourStrings.English = TestData(I)
        FourStrings.Thai = TestData(I + 1)
        FourStrings.ThaiSortCode = GetThaiComparisonString(FourStrings.Thai)
        MyList.Add(FourStrings)
    Next

    MyList.SortType("ThaiSortCode", True)
    
    Dim LineSeparator As String = CRLF

    Dim sb As StringBuilder
    sb.Initialize
    
    sb.Append("INSERT INTO dt_Country (name, sortnumber, english) VALUES ")

    For I = 0 To MyList.Size - 1
        If I <> 0 Then sb.Append(", ")
        sb.Append(LineSeparator)
        
        Dim FS As FourStringsType = MyList.Get(I)
        
        sb.Append("(")
        sb.Append("'" & FS.Thai & "'")
        sb.Append(", ")
        sb.Append(I + 1)
        sb.Append(", ")
        sb.Append("'" & FS.English & "'")
        sb.Append(")")
    Next

    sb.Append(";")
    
    Log(sb.ToString)

End Sub
Log output:
Waiting for debugger to connect...
Program started.
INSERT INTO dt_Country (name, sortnumber, english) VALUES
('กรีซ', 1, 'Greece'),
('กัมพูชา', 2, 'Cambodia'),
('กัวเตมาลา', 3, 'Guatemala'),
('กาตาร์', 4, 'Qatar'),
('กานา', 5, 'Ghana'),
('กาบอง', 6, 'Gabon'),
('กาบูเวร์ดี', 7, 'Cabo Verde'),
('กายอานา', 8, 'Guyana'),
('กินี-บิสเซา', 9, 'Guinea-Bissau'),
('กินี', 10, 'Guinea'),
('เกรเนดา', 11, 'Grenada'),
('เกาหลีใต้', 12, 'Korea (South)'),
('เกาหลีเหนือ', 13, 'Korea (North)'),
('แกมเบีย', 14, 'Gambia'),
('โกตดิวัวร์', 15, 'Côte d'Ivoire'),
('คอโมโรส', 16, 'Comoros'),
('คอสตาริกา', 17, 'Costa Rica'),
('คาซัคสถาน', 18, 'Kazakhstan'),
('คิริบาส', 19, 'Kiribati'),
('คิวบา', 20, 'Cuba'),
('คีร์กีซสถาน', 21, 'Kyrgyzstan'),
('คูเวต', 22, 'Kuwait'),
('เคนยา', 23, 'Kenya'),
('แคนาดา', 24, 'Canada'),
('แคเมอรูน', 25, 'Cameroon'),
('โคโซโว', 26, 'Kosovo'),
('โครเอเชีย', 27, 'Croatia'),
('โคลัมเบีย', 28, 'Colombia'),
('จอร์เจีย', 29, 'Georgia'),
('จอร์แดน', 30, 'Jordan'),
('จาเมกา', 31, 'Jamaica'),
('จิบูตี', 32, 'Djibouti'),
('จีน', 33, 'China'),
('ชาด', 34, 'Chad'),
('ชิลี', 35, 'Chile'),
('ซานมารีโน', 36, 'San Marino'),
('ซามัว', 37, 'Samoa'),
('ซาอุดีอาระเบีย', 38, 'Saudi Arabia'),
('ซิมบับเว', 39, 'Zimbabwe'),
('ซีเรีย', 40, 'Syria'),
('ซูดาน', 41, 'Sudan'),
('ซูดานใต้', 42, 'South Sudan'),
('ซูรินาม', 43, 'Suriname'),
('เซเชลส์', 44, 'Seychelles'),
('เซนต์คิตส์และเนวิส', 45, 'Saint Kitts and Nevis'),
('เซนต์ลูเชีย', 46, 'Saint Lucia'),
('เซนต์วินเซนต์และเกรนาดีนส์', 47, 'Saint Vincent and the Grenadines'),
('เซเนกัล', 48, 'Senegal'),
('เซอร์เบีย', 49, 'Serbia'),
('เซาตูเมและปรินซีปี', 50, 'São Tomé and Príncipe'),
('เซียร์ราลีโอน', 51, 'Sierra Leone'),
('แซมเบีย', 52, 'Zambia'),
('โซมาเลีย', 53, 'Somalia'),
('ไซปรัส', 54, 'Cyprus'),
('ญี่ปุ่น', 55, 'Japan'),
('เดนมาร์ก', 56, 'Denmark'),
('โดมินีกา', 57, 'Dominica'),
('ตรินิแดดและโตเบโก', 58, 'Trinidad and Tobago'),
('ตองงา', 59, 'Tonga'),
('ติมอร์-เลสเต', 60, 'Timor-Leste'),
('ตุรกี', 61, 'Turkey'),
('ตูนิเซีย', 62, 'Tunisia'),
('ตูวาลู', 63, 'Tuvalu'),
('เติร์กเมนิสถาน', 64, 'Turkmenistan'),
('โตโก', 65, 'Togo'),
('ทาจิกิสถาน', 66, 'Tajikistan'),
('แทนซาเนีย', 67, 'Tanzania'),
('ไทย', 68, 'Thailand'),
('นครวาติกัน', 69, 'Vatican City'),
('นอร์เวย์', 70, 'Norway'),
('นามิเบีย', 71, 'Namibia'),
('นาอูรู', 72, 'Nauru'),
('นิการากัว', 73, 'Nicaragua'),
('นิวซีแลนด์', 74, 'New Zealand'),
('เนเธอร์แลนด์', 75, 'Netherlands'),
('เนปาล', 76, 'Nepal'),
('ไนจีเรีย', 77, 'Nigeria'),
('ไนเจอร์', 78, 'Niger'),
('บราซิล', 79, 'Brazil'),
('บรูไน', 80, 'Brunei'),
('บอตสวานา', 81, 'Botswana'),
('บอสเนียและเฮอร์เซโกวีนา', 82, 'Bosnia and Herzegovina'),
('บังกลาเทศ', 83, 'Bangladesh'),
('บัลแกเรีย', 84, 'Bulgaria'),
('บาร์เบโดส', 85, 'Barbados'),
('บาห์เรน', 86, 'Bahrain'),
('บาฮามาส', 87, 'Bahamas'),
('บุรุนดี', 88, 'Burundi'),
('บูร์กินาฟาโซ', 89, 'Burkina Faso'),
('เบนิน', 90, 'Benin'),
('เบลเยียม', 91, 'Belgium'),
('เบลารุส', 92, 'Belarus'),
('เบลีซ', 93, 'Belize'),
('โบลิเวีย', 94, 'Bolivia'),
('ปากีสถาน', 95, 'Pakistan'),
('ปานามา', 96, 'Panama'),
('ปาปัวนิวกินี', 97, 'Papua New Guinea'),
('ปารากวัย', 98, 'Paraguay'),
('ปาเลา', 99, 'Palau'),
('เปรู', 100, 'Peru'),
('โปรตุเกส', 101, 'Portugal'),
('โปแลนด์', 102, 'Poland'),
('ฝรั่งเศส', 103, 'France'),
('พม่า', 104, 'Myanmar'),
('ฟินแลนด์', 105, 'Finland'),
('ฟิลิปปินส์', 106, 'Philippines'),
('ฟีจิ', 107, 'Fiji'),
('ภูฏาน', 108, 'Bhutan'),
('มองโกเลีย', 109, 'Mongolia'),
('มอนเตเนโกร', 110, 'Montenegro'),
('มอริเชียส', 111, 'Mauritius'),
('มอริเตเนีย', 112, 'Mauritania'),
('มอลโดวา', 113, 'Moldova'),
('มอลตา', 114, 'Malta'),
('มัลดีฟส์', 115, 'Maldives'),
('มาซิโดเนียเหนือ', 116, 'North Macedonia'),
('มาดากัสการ์', 117, 'Madagascar'),
('มาลาวี', 118, 'Malawi'),
('มาลี', 119, 'Mali'),
('มาเลเซีย', 120, 'Malaysia'),
('เม็กซิโก', 121, 'Mexico'),
('โมซัมบิก', 122, 'Mozambique'),
('โมนาโก', 123, 'Monaco'),
('โมร็อกโก', 124, 'Morocco'),
('ไมโครนีเชีย', 125, 'Micronesia'),
('ยูกันดา', 126, 'Uganda'),
('ยูเครน', 127, 'Ukraine'),
('เยเมน', 128, 'Yemen'),
('เยอรมนี', 129, 'Germany'),
('รวันดา', 130, 'Rwanda'),
('รัสเซีย', 131, 'Russia'),
('โรมาเนีย', 132, 'Romania'),
('ลักเซมเบิร์ก', 133, 'Luxembourg'),
('ลัตเวีย', 134, 'Latvia'),
('ลาว', 135, 'Laos'),
('ลิกเตนสไตน์', 136, 'Liechtenstein'),
('ลิทัวเนีย', 137, 'Lithuania'),
('ลิเบีย', 138, 'Libya'),
('เลโซโท', 139, 'Lesotho'),
('เลบานอน', 140, 'Lebanon'),
('ไลบีเรีย', 141, 'Liberia'),
('วานูอาตู', 142, 'Vanuatu'),
('เวเนซุเอลา', 143, 'Venezuela'),
('เวียดนาม', 144, 'Vietnam'),
('ศรีลังกา', 145, 'Sri Lanka'),
('สเปน', 146, 'Spain'),
('สโลวาเกีย', 147, 'Slovakia'),
('สโลวีเนีย', 148, 'Slovenia'),
('สวิตเซอร์แลนด์', 149, 'Switzerland'),
('สวีเดน', 150, 'Sweden'),
('สหรัฐอเมริกา', 151, 'United States'),
('สหรัฐอาหรับเอมิเรตส์', 152, 'United Arab Emirates'),
('สหราชอาณาจักร', 153, 'United Kingdom'),
('สาธารณรัฐคองโก', 154, 'Congo (Republic of the)'),
('สาธารณรัฐเช็ก', 155, 'Czech Republic'),
('สาธารณรัฐโดมินิกัน', 156, 'Dominican Republic'),
('สาธารณรัฐประชาธิปไตยคองโก', 157, 'Congo (Democratic Republic of the)'),
('สาธารณรัฐแอฟริกากลาง', 158, 'Central African Republic'),
('สิงคโปร์', 159, 'Singapore'),
('หมู่เกาะโซโลมอน', 160, 'Solomon Islands'),
('หมู่เกาะมาร์แชลล์', 161, 'Marshall Islands'),
('ออสเตรเลีย', 162, 'Australia'),
('ออสเตรีย', 163, 'Austria'),
('อันดอร์รา', 164, 'Andorra'),
('อัฟกานิสถาน', 165, 'Afghanistan'),
('อาเซอร์ไบจาน', 166, 'Azerbaijan'),
('อาร์เจนตินา', 167, 'Argentina'),
('อาร์มีเนีย', 168, 'Armenia'),
('อิเควทอเรียลกินี', 169, 'Equatorial Guinea'),
('อิตาลี', 170, 'Italy'),
('อินเดีย', 171, 'India'),
('อินโดนีเซีย', 172, 'Indonesia'),
('อิรัก', 173, 'Iraq'),
('อิสราเอล', 174, 'Israel'),
('อิหร่าน', 175, 'Iran'),
('อียิปต์', 176, 'Egypt'),
('อุซเบกิสถาน', 177, 'Uzbekistan'),
('อุรุกวัย', 178, 'Uruguay'),
('เอกวาดอร์', 179, 'Ecuador'),
('เอธิโอเปีย', 180, 'Ethiopia'),
('เอริเทรีย', 181, 'Eritrea'),
('เอลซัลวาดอร์', 182, 'El Salvador'),
('เอสโตเนีย', 183, 'Estonia'),
('เอสวาตีนี', 184, 'Eswatini'),
('แองโกลา', 185, 'Angola'),
('แอนทิกาและบาร์บูดา', 186, 'Antigua and Barbuda'),
('แอฟริกาใต้', 187, 'South Africa'),
('แอลจีเรีย', 188, 'Algeria'),
('แอลเบเนีย', 189, 'Albania'),
('โอมาน', 190, 'Oman'),
('ไอซ์แลนด์', 191, 'Iceland'),
('ไอร์แลนด์', 192, 'Ireland'),
('ฮอนดูรัส', 193, 'Honduras'),
('ฮังการี', 194, 'Hungary'),
('เฮติ', 195, 'Haiti');
 
Upvote 0
Top