マクロ変数内にunicode文字がある場合の検No.02465
K'zawa さん 09/07/04 15:56
 
こんにちは、K'zawaです。

下記 Test.mac を、サンプルテキストで実行すると、
FindRegular と strstr で異なる値が返ってきます。
同じサンプルテキストを ShiftJIS として開き直すと、値は一致します。
そんなもんでしょうか?

strlen, rightstr, leftstr, midstr も strstr に一蓮托生のようで、
これらだけでは問題がないのですが、正規表現で検索できなくて…。


// Test.mac ---
loaddll "HmJre.dll";
$str = gettext( 0, y, 2000, y );
    #pos = dllfunc( "FindRegular", "abc", $str, #pos );
    #pos2 = strstr( $str, "abc" );
message "FindRegular: " + str( #pos ) + "\nstrstr: " + str( #pos2 );
// ----------


サンプルテキスト(utf-8)

・abc

("・"は 0xC2B7 の文字)

秀丸エディタ V7.11
Hmjre.dll V2.03

[ ]
RE:02465 マクロ変数内にunicode文字があNo.02466
秀丸担当 さん 09/07/06 12:22
 
手順どおりにしてやってみたところ、確かに言われている通りになりました。
調べてみたら、Unicode文字はdllfuncに渡す時点で'?'等に変換して渡していまし
た。
一応dllfuncで呼ばれる関数はUnicode対応ではないという前提で、そのように変
換していたようです。

一方、秀丸メールの tkinfo.dll は秀丸エディタ独自のUnicodeの形式を判断する
ようになっていて、そのため秀丸メール上の dllfunc はUnicode文字を4バイトと
して計算する独自形式を渡していました。
その影響もあり、秀丸メールのほうで FindReglarするとUnicode文字は4文字とし
て数えられてしまいました。

秀丸エディタのV8.00では秀丸メールのほうに合わせることを考えていたのですが、
そうだとしても strstr とは計算が合わないです。
また、一般のDLLのためには独自形式は渡すべきではないと思います。
何らかのうまく解決できる方法を考えないといけないので、具体的にはまだ何と
も言えませんが、検討させていただきます。

現状では、実際に秀丸エディタ上にテキストを挿入して検索してみるなどの方法
を取っていただくしかないと思います。
申し訳ありません。

[ ]
RE:02466 マクロ変数内にunicode文字があNo.02467
K'zawa さん 09/07/06 23:08
 
秀丸担当さん、こんにちは。
K'zawaです。

>調べてみたら、Unicode文字はdllfuncに渡す時点で'?'等に変換して渡していまし
>た。
>一応dllfuncで呼ばれる関数はUnicode対応ではないという前提で、そのように変
>換していたようです。
>
>一方、秀丸メールの tkinfo.dll は秀丸エディタ独自のUnicodeの形式を判断する
>ようになっていて、そのため秀丸メール上の dllfunc はUnicode文字を4バイトと
>して計算する独自形式を渡していました。

そうなんですか…。

>何らかのうまく解決できる方法を考えないといけないので、具体的にはまだ何と
>も言えませんが、検討させていただきます。

よろしくお願いします。

>現状では、実際に秀丸エディタ上にテキストを挿入して検索してみるなどの方法
>を取っていただくしかないと思います。

自作DLLでごまかしました。
ユニコード文字は別の文字になってましたが…今回は放置。

[ ]