FindRegular と ユニコードNo.05320
山紫水明 さん 10/03/09 20:39
 
新規の関数 SetUnicodeIndexAutoConvert を次のマクロで試してみました。

//--------------------------------------------------
loaddll "hmjre.dll";
#n = dllfunc("SetUnicodeIndexAutoConvert", 1);
$seperator = "[,/\u2f]";
$line1 = "\uC0\uC1\uC2,\uD2\uD3\uD4";         //(1)
$line2 = "\uC0\uC1\uC2あいabc/\uD2\uD3\uD4"; //(2)
$line3 = "あいうabc\u2fあいうddd";            //(3)
#a = dllfunc( "FindRegular", $seperator, $line1, 0 );
$part1a = wcsleftstr($line1, #a);
$part1b = wcsmidstr($line1, #a + 1);
message $part1a;
message $part1b;
#a = dllfunc( "FindRegular", $seperator, $line2, 0 );
$part2a = wcsleftstr($line2, #a);
$part2b = wcsmidstr($line2, #a + 1);
message $part2a;
message $part2b;
#a = dllfunc( "FindRegular", $seperator, $line3, 0 );
$part3a = wcsleftstr($line3, #a);
$part3b = wcsmidstr($line3, #a + 1);
message $part3a;
message $part3b;
freedll;
endmacro;
//--------------------------------------------------

(1) は成功しますが,(2),(3)はうまくいきません。
次のマクロでも同じ結果になりました。使い方がおかしいのでしょうか。

//--------------------------------------------------
loaddll "hmjre.dll";
$seperator = "[,/\u2f]";
$line1 = "\uC0\uC1\uC2,\uD2\uD3\uD4";         //(1)
$line2 = "\uC0\uC1\uC2あいabc/\uD2\uD3\uD4"; //(2)
$line3 = "あいうabc\u2fあいうddd";            //(3)
#a = dllfunc( "FindRegular", $seperator, $line1, 0 );
#a = byteindex_to_charindex( $line1, #a );
$part1a = wcsleftstr($line1, #a);
$part1b = wcsmidstr($line1, #a + 1);
message $part1a;
message $part1b;
#a = dllfunc( "FindRegular", $seperator, $line2, 0 );
#a = byteindex_to_charindex( $line2, #a );
$part2a = wcsleftstr($line2, #a);
$part2b = wcsmidstr($line2, #a + 1);
message $part2a;
message $part2b;
#a = dllfunc( "FindRegular", $seperator, $line3, 0 );
#a = byteindex_to_charindex( $line3, #a );
$part3a = wcsleftstr($line3, #a);
$part3b = wcsmidstr($line3, #a + 1);
message $part3a;
message $part3b;
freedll;
endmacro;
//--------------------------------------------------

 なお,前のスレッドで h-tom さんに紹介していただいた"hmonig.dll"を使う
と成功します。
//--------------------------------------------------
loaddll "hmonig.dll";
$seperator = "[,//\u2f]";
$line1 = "\uC0\uC1\uC2,\uD2\uD3\uD4";
$line2 = "\uC0\uC1\uC2あいabc/\uD2\uD3\uD4";
$line3 = "あいうabc\u2fあいうddd";
#a = dllfuncw( "FindRegularW", $seperator, $line1, 0 );
$part1a = wcsleftstr($line1, #a);
$part1b = wcsmidstr($line1, #a + 1);
message $part1a;
message $part1b;
#a = dllfuncw( "FindRegularW", $seperator, $line2, 0 );
$part2a = wcsleftstr($line2, #a);
$part2b = wcsmidstr($line2, #a + 1);
message $part2a;
message $part2b;
#a = dllfuncw( "FindRegularW", $seperator, $line3, 0 );
$part3a = wcsleftstr($line3, #a);
$part3b = wcsmidstr($line3, #a + 1);
message $part3a;
message $part3b;
freedll;
endmacro;
//--------------------------------------------------

              山紫水明

[ ]
RE:05320 FindRegular と ユニコードNo.05322
山紫水明 さん 10/03/09 22:09
 

 追伸です。
 それぞれ charindex_to_wideindex() 関数を追加してやればうまくいくようです
が,この使い方でいいでしょうか。

//--------------------------------------------------
loaddll "hmjre.dll";
#n = dllfunc("SetUnicodeIndexAutoConvert", 1);
$seperator = "[,/\u2f]";
$line1 = "\uC0\uC1\uC2,\uD2\uD3\uD4";         //(1)
$line2 = "\uC0\uC1\uC2あいabc/\uD2\uD3\uD4"; //(2)
$line3 = "あいうabc\u2fあいうddd";            //(3)
#a = dllfunc( "FindRegular", $seperator, $line1, 0 );
#a = charindex_to_wideindex( $line1, #a );
$part1a = wcsleftstr($line1, #a);
$part1b = wcsmidstr($line1, #a + 1);
message $part1a;
message $part1b;
#a = dllfunc( "FindRegular", $seperator, $line2, 0 );
#a = charindex_to_wideindex( $line2, #a );
$part2a = wcsleftstr($line2, #a);
$part2b = wcsmidstr($line2, #a + 1);
message $part2a;
message $part2b;
#a = dllfunc( "FindRegular", $seperator, $line3, 0 );
#a = charindex_to_wideindex( $line3, #a );
$part3a = wcsleftstr($line3, #a);
$part3b = wcsmidstr($line3, #a + 1);
message $part3a;
message $part3b;
freedll;
endmacro;
//--------------------------------------------------

//--------------------------------------------------
loaddll "hmjre.dll";
$seperator = "[,/\u2f]";
$line1 = "\uC0\uC1\uC2,\uD2\uD3\uD4";         //(1)
$line2 = "\uC0\uC1\uC2あいabc/\uD2\uD3\uD4"; //(2)
$line3 = "あいうabc\u2fあいうddd";            //(3)
#a = dllfunc( "FindRegular", $seperator, $line1, 0 );
#a = byteindex_to_charindex( $line1, #a );
#a = charindex_to_wideindex( $line1, #a );
$part1a = wcsleftstr($line1, #a);
$part1b = wcsmidstr($line1, #a + 1);
message $part1a;
message $part1b;
#a = dllfunc( "FindRegular", $seperator, $line2, 0 );
#a = byteindex_to_charindex( $line2, #a );
#a = charindex_to_wideindex( $line2, #a );
$part2a = wcsleftstr($line2, #a);
$part2b = wcsmidstr($line2, #a + 1);
message $part2a;
message $part2b;
#a = dllfunc( "FindRegular", $seperator, $line3, 0 );
#a = byteindex_to_charindex( $line3, #a );
#a = charindex_to_wideindex( $line3, #a );
$part3a = wcsleftstr($line3, #a);
$part3b = wcsmidstr($line3, #a + 1);
message $part3a;
message $part3b;
freedll;
endmacro;
//--------------------------------------------------

                                    山紫水明
                                    SANSHISUIMEI

[ ]
RE:05320 FindRegular と ユニコードNo.05324
h-tom さん 10/03/10 00:06
 

h-tom です。

>新規の関数 SetUnicodeIndexAutoConvert を次のマクロで試してみました。
>
<省 略>
>//--------------------------------------------------
>
>(1) は成功しますが,(2),(3)はうまくいきません。
文字を切り出す箇所が問題です。


  $part1a = wcsleftstr($line1, #a);
  $part1b = wcsmidstr($line1, #a + 1);

  $part1a = leftstr($line1, #a);
  $part1b = midstr($line1, #a + 1);

 (2)は、"+ 2" しないとダメですが。

"SetUnicodeIndexAutoConvert"を有効にした場合、unicode = 4バイト換算で、
返す値を、通常の文字列操作関数で、"問題なく使用できる値" にして、返します。

その為、文字列操作を行う場合は、通常の関数(?)を使う必要があります。

[ ]
RE:05324 FindRegular と ユニコードNo.05325
山紫水明 さん 10/03/10 08:23
 
 h-tomさん,

>その為、文字列操作を行う場合は、通常の関数(?)を使う必要があります。

 なるほど,あえて wcs〜 関数を使ったのが間違いでしたか。

> (2)は、"+ 2" しないとダメですが。

 "GetLastMatchLength" 関数で取得した値を加えればいいということになりますか。

//--------------------------------------------------
loaddll "hmjre.dll";
#n = dllfunc("SetUnicodeIndexAutoConvert", 1);
$seperator = "[,/\u2f]";
$line1 = "\uC0\uC1\uC2,\uD2\uD3\uD4";         //(1)
$line2 = "\uC0\uC1\uC2あいabc/\uD2\uD3\uD4"; //(2)
$line3 = "あいうabc\u2fあいうddd";            //(3)
#a = dllfunc( "FindRegular", $seperator, $line1, 0 );
$part1a = leftstr($line1, #a);
$part1b = midstr($line1, #a + dllfunc( "GetLastMatchLength"));
message $part1a;
message $part1b;
#a = dllfunc( "FindRegular", $seperator, $line2, 0 );
$part2a = leftstr($line2, #a);
$part2b = midstr($line2, #a + dllfunc( "GetLastMatchLength"));
message $part2a;
message $part2b;
#a = dllfunc( "FindRegular", $seperator, $line3, 0 );
$part3a = leftstr($line3, #a);
$part3b = midstr($line3, #a + dllfunc( "GetLastMatchLength"));
message $part3a;
message $part3b;
freedll;
endmacro;
//--------------------------------------------------
     では, (^^)/~
                                    山紫水明
                                    SANSHISUIMEI

[ ]
RE:05325 FindRegular と ユニコードNo.05327
秀丸担当 さん 10/03/10 10:08
 

>>その為、文字列操作を行う場合は、通常の関数(?)を使う必要があります。
>
> なるほど,あえて wcs〜 関数を使ったのが間違いでしたか。

h-tomさんも言われている通り、SetUnicodeIndexAutoConvertを使うとleftstrの
ような通常の関数で扱えるように自動的に変換されるので、そういうことでお願
いします。

>> (2)は、"+ 2" しないとダメですが。
>
> "GetLastMatchLength" 関数で取得した値を加えればいいということになりますか。

こちらはGetLastMatchLengthを使うことでいいのではないかと思います。

[ ]