文字列を比較する          <TOP>


文字列1と文字列2の語彙の値を比較します。

GetThreadLocale スレッドのロケールIDを取得

CompareString 比較オプションに対応した文字列比較関数

 

大文字小文字を区別する場合                                       大文字小文字を区別しない場合

 

カタカナとひらがなを区別する場合                                 カタカナとひらがなを区別しない場合

 

記号を無視しない場合                                                 記号を無視した場合

 

参考

ロケールとは、ソフトウェアに内蔵される、言語や国・地域ごとに異なる単位、記号、日付、通貨などの表記規則の集合。

そういえば、Microsoft Office 配下などに1041などのフォルダがありましたネ!

    アイスランド語:1039
    インドネシア語:1057
    イタリア語:1040
    英語(オーストラリア):3081
    英語(カナダ):4105
    英語(U.K.):2057
    英語(U.S.):1033
    日本語:1041
    韓国語:1042
    ラテン語:1142

'================================================================
'= 文字列を比較する
'=    (CompareString.bas)
'================================================================
#include "Windows.bi"

' スレッドのロケールIDを取得
Declare Function Api_GetThreadLocale& Lib "kernel32" Alias "GetThreadLocale" ()

' 比較オプションに対応した文字列比較関数
Declare Function Api_CompareString& Lib "kernel32" Alias "CompareStringA" (ByVal Locale&, ByVal dwCmpFlags&, ByVal lpString1$, ByVal cchCount1&, ByVal lpString2$, ByVal cchCount2&)

#define CSTR_EQUAL 2                    '文字列1=文字列2
#define CSTR_GREATER_THAN 3             '文字列1>文字列2
#define CSTR_LESS_THAN 1                '文字列1<文字列2

#define NORM_IGNORECASE &H1             '大文字・小文字を区別しない
#define NORM_IGNOREKANAType &H10000     'ひらがな・カタカナを区別しない
#define NORM_IGNORENONSPACE &H2         '場所を取らない文字を区別しない
#define NORM_IGNORESYMBOLS &H4          '記号を無視する
#define NORM_IGNOREWIDTH &H20000        '1バイト文字とそれと同じ2バイト文字を区別しない

#define SORT_STRINGSORT &H1000
#define LOCALE_SYSTEM_DEFAULT &H400     'システムのデフォルトロケール
#define LOCALE_USER_DEFAULT &H800       '現在のユーザのデフォルトロケール

Var Shared Edit1 As Object : Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Var Shared Edit2 As Object : Edit2.Attach GetDlgItem("Edit2") : Edit2.SetFontSize 14
Var Shared Text3 As Object : Text3.Attach GetDlgItem("Text3") : Text3.SetFontSize 14
Var Shared Text4 As Object : Text4.Attach GetDlgItem("Text4") : Text4.SetFontSize 14
Var Shared Check(4) As Object

For i = 0 To 4
    Check(i).Attach GetDlgItem("Check" & Trim$(Str$(i + 1)))
    Check(i).SetFontSize 14
Next

Var Shared Flags(4) As Long

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hTL As Long
    Var Str1 As String
    Var Str2 As String

    'スレッドのロケールIDを取得
    hTL = Api_GetThreadLocale()

    Str1 = GetDlgItemText("Edit1")
    Str2 = GetDlgItemText("Edit2")

    If Check(0).GetCheck = 1 Then Flags(0) = NORM_IGNORECASE     Else Flags(0) = 0
    If Check(1).GetCheck = 1 Then Flags(1) = NORM_IGNOREKANAType Else Flags(1) = 0
    If Check(2).GetCheck = 1 Then Flags(2) = NORM_IGNORENONSPACE Else Flags(2) = 0
    If Check(3).GetCheck = 1 Then Flags(3) = NORM_IGNORESYMBOLS  Else Flags(3) = 0
    If Check(4).GetCheck = 1 Then Flags(4) = NORM_IGNOREWIDTH    Else Flags(4) = 0

    Select Case Api_CompareString(hTL, Flags(0) + Flags(1) + Flags(2) + Flags(3) + Flags(4), Str1, Len(Str1), Str2, Len(Str2))
        Case CSTR_LESS_THAN
            Text3.SetWindowText "<"
            Text4.SetWindowText "文字列1は、文字列2より語彙の値が小さい"
        Case CSTR_EQUAL
            Text3.SetWindowText "="
            Text4.SetWindowText "文字列1は、文字列2の語彙の値と等しい"
        Case CSTR_GREATER_THAN
            Text3.SetWindowText ">"
            Text4.SetWindowText "文字列1は、文字列2の語彙の値が大きい"
    End Select
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End