last updated:2024/07/31
できます。
ただし、比較のルールは文字コード順ではなく、辞書引き順となります。
大小比較をする場合は注意が必要です。辞書引き順のルールは以下のようになっているようです。
(以下は、本Q&A執筆者が独自に調査した結果を基に記述しています。このルールに基づかない結果になることがあるかもしれません)
例に示す式はすべて真です。
(1-a)
(1-b)
ここまでで決着がつかなかった場合に、次のルールを適用します。
(2)
ここまでで2つの文字列に違いが見られない場合、2つの文字列は同じであるという結果になります。
例) "バ"=="ハ゛" 漢字や記号など言及していない部分もあります(一部、例2も参照ください)が、ここで挙げていくときりがないので、ご自身で確かめてみましょう。
(例1)
次のマクロは、編集中のテキストのカーソル位置から、英大文字で始まる単語を取得して1単語ずつダイアログボックスに表示させようとしたものです。
ファイルの最後に達するまで繰り返します。
gowordtop;
#x1 = x;
#y1 = y;
while( 1 ) {
wordright;
if( result == false ) {
break;
}
$str = gettext(#x1, #y1, x, y);
$s1 = leftstr($str, 1);
if( $s1 >= "A" && $s1 <= "Z" ) { // *1
message $str;
}
#x1 = x;
#y1 = y;
}
英単語かどうかの判断に文字列の比較を使用しています (*1 の行)。
("A"〜"Z"で始まる単語を英単語であると判断)
このマクロは英大文字で始まる単語のみを表示する目的で作成したものですが、前述したルールにより英小文字で始まる単語も表示してしまいます。
正しく英大文字で始まる単語のみを表示するには、*1 の行を次のように変更します。
if( ascii($s1) >= 'A' && ascii($s1) <= 'Z' ) { // *1
比較対象を文字(列)のままではなく文字コードに変換して比較します。
※ AとZの囲みがシングルクォートに変わっていることに注意。
(例2)
例1の例を含めて、秀丸エディタの文字列比較(<, ==, >の演算子で行うもの)はWin32API の lstrcmp()を使っているので、その通りのルールになっています。
そのため、比較結果が以下のようなちょっと凝った?ものになります。
厳密に(単純に)同じ文字列か比較を行いたい場合は、以下のような方法があります。
$a = input ("1個め", "");
$b = input ("2個め", "");
// 秀丸エディタの比較演算子による文字列比較 (WIN32 API のlstrcmp()と同じ)
if ($a == $b) {
message "$a == $b";
} else if ($a > $b) {
message "$a > $b";
} else {
message "$a < $b";
}
// 厳密な比較例
if (($a == "") && ($b == "")) {
// 例外的に strstr("", "") == -1 になります。
message "$a と $b は共にヌルストリングです。";
} else if ((strlen($a) == strlen($b)) && (strstr($a, $b) == 0)) {
message "本当に $a と $b は同じ文字列です。";
} else {
message "$a と $b は違う文字列です。";
}
endmacro;
厳密な(単純な)大小関係を知りたい場合は、ascii関数を使って1文字ずつ比較する方法があります。
辞書引き順の詳細は、JISの日本語文字列照合順番 X4061-1996で定義されています。