dllfuncstrwの戻り値との比較No.05456
h-tom さん 10/03/25 00:00
 

h-tom です。

秀丸エディタ:Ver.8β47
OS:Windows Vista SP2(32bit)

unicodeで、Shift_JISに含まれない文字を含む場合、dllfuncstrwの戻り値
と、文字変数を比較した場合、一致しません。

dllfuncstrwで呼ぶ関数は、wcscpyで、引数をコピーして返すだけの関数で
すが、添付のマクロで、"一致しない"と、なってしまいます。
message文で見ると、同じに見えますし、一文字ずつ、unicode関数で文字
コードを確認しましたが、違いがないです。
(unicode部分を削除すると、"一致"する。)

//ここから
loaddll "ht_tools.dll";
$a = "秀丸エディタ\u7730";

//引数をwcscpyして、Unicode文字列を返すだけの関数。
$b = dllfuncstrw("CopyW", $a);

if($a == $b){
    message "一致";
}else{
    message "一致しない" + "\n$a:" + $a + "\n$b:" + $b;
}
freedll;
//ここまで

[ ]
RE:05456 dllfuncstrwの戻り値との比較No.05458
秀丸担当 さん 10/03/25 10:10
 

>unicodeで、Shift_JISに含まれない文字を含む場合、dllfuncstrwの戻り値
>と、文字変数を比較した場合、一致しません。

マクロの通りにして再現させることができました。
報告いただき大変助かりました。
正式版では修正させていただきます。

内部の全角情報フラグが一致していなくて違うと判定されてしまっていました。
とりあえずの対策としては、
$a = "秀丸エディタ"+unichar(0x24e9);
というようにしておくと回避させることもできました。

[ ]
RE:05458 dllfuncstrwの戻り値との比較No.05490
h-tom さん 10/03/30 15:49
 

h-tom です。

秀丸エディタ:Ver.8(正式版)

>マクロの通りにして再現させることができました。
>報告いただき大変助かりました。
>正式版では修正させていただきます。
>
>内部の全角情報フラグが一致していなくて違うと判定されてしまっていました。
>とりあえずの対策としては、
>$a = "秀丸エディタ"+unichar(0x24e9);
>というようにしておくと回避させることもできました。
文字列の比較は問題ないです。
同じ問題かもしれませんが、同じ文字列を、strstr/wscstrstr で検索しても、
見つかりません。

//ここから
loaddll "ht_tools.dll";
$a = "秀丸エディタ\u7730";

//引数をwcscpyして、Unicode文字列を返すだけの関数。
$b = dllfuncstrw("CopyW", $a);
freedll;
loaddll "HmOutputPane.dll";

$hed = "$a == $b :";
if($a == $b){
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "match\n");
}else{
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "not match\n");
}

$hed = "$a == \"秀丸エディタ\\u7730\" :";
if($a == "秀丸エディタ\u7730"){
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "match\n");
}else{
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "not match\n");
}

$hed = "$b == \"秀丸エディタ\\u7730\" :";
if($b == "秀丸エディタ\u7730"){
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "match\n");
}else{
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "not match\n");
}

$hed = "strstr(\"秀丸エディタ\\u7730\", $a) :";
#n = strstr("秀丸エディタ\u7730", $a);
if(#n != -1){
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "match: #n=" + str(#n) + "
\n");
}else{
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "not match: #n=" + str(#n)
 +"\n");
}

$hed = "strstr(\"秀丸エディタ\\u7730\", $b) :";
#n = strstr("秀丸エディタ\u7730", $b);
if(#n != -1){
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "match: #n=" + str(#n) + "
\n");
}else{
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "not match: #n=" + str(#n)
 + "\n");
}

$hed = "strstr($b, $a) :";
#n = strstr($b, $a);
if(#n != -1){
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "match: #n=" + str(#n) + "
\n");
}else{
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "not match: #n=" + str(#n)
 + "\n");
}

$hed = "strstr($a, $b) :";
#n = strstr($a, $b);
if(#n != -1){
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "match: #n=" + str(#n) + "
\n");
}else{
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "not match: #n=" + str(#n)
 + "\n");
}

$hed = "wcsstrstr($b, $a) :";
#n = wcsstrstr($b, $a);
if(#n != -1){
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "match: #n=" + str(#n) + "
\n");
}else{
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "not match: #n=" + str(#n)
 + "\n");
}

$hed = "wcsstrstr($a, $b) :";
#n = wcsstrstr($a, $b);
if(#n != -1){
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "match: #n=" + str(#n) + "
\n");
}else{
  #ret=dllfunc("Output",hidemaruhandle(0), $hed + "not match: #n=" + str(#n)
 + "\n");
}

freedll;
endmacro;//ここまで

//出力結果 ここから
$a == $b :match
$a == "秀丸エディタ\u7730" :match
$b == "秀丸エディタ\u7730" :match
strstr("秀丸エディタ\u7730", $a) :match: #n=0
strstr("秀丸エディタ\u7730", $b) :not match: #n=-1
strstr($b, $a) :not match: #n=-1
strstr($a, $b) :not match: #n=-1
wcsstrstr($b, $a) :not match: #n=-1
wcsstrstr($a, $b) :not match: #n=-1
//出力結果 ここまで

[ ]
RE:05490 dllfuncstrwの戻り値との比較No.05492
秀丸担当 さん 10/03/30 16:19
 

>文字列の比較は問題ないです。
>同じ問題かもしれませんが、同じ文字列を、strstr/wscstrstr で検索しても、
>見つかりません。

早速の報告ありがとうございます。
全くその通りでした。
strstrはV7.11以前から同様の問題があったようです。
V8.01を出す機会があればそのときに修正させていただきます。

[ ]