C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VB6とVB.NETのLike演算子の違いについて


(過去ログ 119 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■69721 / inTopicNo.1)  VB6とVB.NETのLike演算子の違いについて
  
□投稿者/ an (22回)-(2014/01/24(Fri) 15:22:34)

分類:[VB.NET/VB2005 以降] 

環境:Win8.1Pro + VS2008 Standard Edition SP1 + .NET3.5 SP1


現在、VB6で開発されたアプリケーションをVB.NET2008にアップグレードしているのですが、
その際に以下のコードでVB6とVB.NETで動作が異なっています。

回避方法については、いくつか案があり、回避できることは分かっているのですが、
上に報告する際に、なぜそのような事が起きているか理由が分からず、困っています。


対象の処理の確認用のミニマムコードは以下の通りです。
(実際の処理とは文字が異なりますが結果は同じです。)

Dim flg As Boolean 
flg = ("一田" Like "?*一田")

この処理で変数flgに代入これがVB6ではFalseになり、VB.NETではTrueになりました。


ちなみに確認のため、以下のサンプルプログラムをVB6とVB.NETで実行しました。
(現在VB6の環境は現在手元になく、元のソースとEXEファイルしかないので、
 VB6での以下のサンプルプログラムおよび上記ミニマムコードの実行は、
 Win7上のExcel2010のVBAにて確認しました。)

===========================
Dim moto As String
Dim pattern As String

moto = "一田"

pattern = "?*一田"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))

pattern = "*?一田"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))

pattern = "一田*?"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))

pattern = "一田?*"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))


moto = "山一田"

pattern = "?*一田"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))

pattern = "*?一田"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))

pattern = "一田*?"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))

pattern = "一田?*"
Debug.Print ("""" & moto & """ like """ & pattern & """:" & (moto Like pattern))
===========================

VB6では以下のような結果が得られました。
 "一田" like "?*一田":False
 "一田" like "*?一田":False
 "一田" like "一田*?":False
 "一田" like "一田?*":False
 "山一田" like "?*一田":True
 "山一田" like "*?一田":True
 "山一田" like "一田*?":False
 "山一田" like "一田?*":False

VB.NETでは以下のような結果が得られました。
 "一田" like "?*一田":True
 "一田" like "*?一田":False
 "一田" like "一田*?":False
 "一田" like "一田?*":False
 "山一田" like "?*一田":True
 "山一田" like "*?一田":True
 "山一田" like "一田*?":False
 "山一田" like "一田?*":False

この結果から?と*の位置によって動作が異なるようですが
Like演算子のヘルプを見てもこれに関する情報は見当たりませんでした。
(参照ヘルプ:http://msdn.microsoft.com/ja-jp/library/swf8kaxw(VS.90).aspx )

また上記サンプルプログラムの変数motoおよび変数patternに代入される「一田」を
すべて「田」に全置換して実行すると、
VB6とVB.NETの処理結果が上記VB6の処理結果と同様となり、一致しました。
(文字数の影響もありそうですが、今回の対象の処理では2文字ですので・・・)


#蛇足ですが、
#VB2008によるアップグレードウィザードによってアップグレードした際には
#このLikeによる処理について、特にUpgradeWarning等のレポートはありませんでした。


上記について、理由またはこれに関する資料が記載されているページ等をご存じの方、
お教え願えないでしょうか?

もちろん、それ以外の細かい情報(推測等)や他にチェックすべき項目等でも構いません。

よろしくお願いします。

引用返信 編集キー/
■69722 / inTopicNo.2)  Re[1]: VB6とVB.NETのLike演算子の違いについて
□投稿者/ 魔界の仮面弁士 (510回)-(2014/01/24(Fri) 16:01:30)
2014/01/24(Fri) 16:21:43 編集(投稿者)

No69721 (an さん) に返信
> Dim flg As Boolean
> flg = ("一田" Like "?*一田")
> この処理で変数flgに代入これがVB6ではFalseになり、VB.NETではTrueになりました。
? は「任意の1文字」を意味します。
* は「0文字以上の任意の文字列」を意味します。

すなわち "?*一田" は、最低でも 3 文字無ければいけないので、
本来は False となるべきであり、VB2008 の実装が誤っています。

他にも、「"b" Like "*a*b"」が True になってしまう不具合が報告されています。
https://connect.microsoft.com/VisualStudio/feedback/details/748415/


> その際に以下のコードでVB6とVB.NETで動作が異なっています。
多言語対応(digraph 関連など)のために仕様が変更されている部分がありますので、
文字列の扱いについては、完全に VB6 と同じというわけではありません。
実際、Like だけでなく StrComp や = 演算子あるいは Replace 関数等も
幾許かの undocumented な変更点が見られます。。

しかも VB.NET のバージョンによって動作が異なる部分さえあります。
かつて .NET 1.x 系においては、Option Compare の実装に問題があって、
テキストモードにおける濁点半濁点の処理が、正しく行われなない
という話も、今は亡き eXConn のサイトに投稿されていましたし。


手軽な Like も捨てがたいとは思いますが、今となっては、
Regex を使った方が被害が少ないかと思います。
引用返信 編集キー/
■69727 / inTopicNo.3)  Re[2]: VB6とVB.NETのLike演算子の違いについて
□投稿者/ an (23回)-(2014/01/24(Fri) 17:33:01)
No69722 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さん、早速の回答ありがとうございます。

> 他にも、「"b" Like "*a*b"」が True になってしまう不具合が報告されています。
> https://connect.microsoft.com/VisualStudio/feedback/details/748415/

上記処理を動作させてみました。(参考サイトの英語が読めなかったので・・・)
確かにVB6とVB.NETで結果が違いますね。
また参考サイトにある別例
 "String1" Like "*AnyText1*AnyText2*AnyText???******????*String1"
も同様のようですね。


> 多言語対応(digraph 関連など)のために仕様が変更されている部分がありますので、
> 文字列の扱いについては、完全に VB6 と同じというわけではありません。

Like演算子のヘルプを見た際にDigraphに関する説明があり、
これ少し怪しいなぁとは思いましたが、説明を読んだ限りでは無関係と判断してしまいました。
実際は間接的に影響している可能性があるのかもしれませんね。


> 実際、Like だけでなく StrComp や = 演算子あるいは Replace 関数等も
> 幾許かの undocumented な変更点が見られます。。

なるほど。
まぁ全ての変更点を公開してたらキリがないのでしょうね。


> しかも VB.NET のバージョンによって動作が異なる部分さえあります。
> かつて .NET 1.x 系においては、Option Compare の実装に問題があって、
> テキストモードにおける濁点半濁点の処理が、正しく行われなない
> という話も、今は亡き eXConn のサイトに投稿されていましたし。

そんな話もあるんですね。
こういう情報はあまり得る機会がないので、参考になります。


> 手軽な Like も捨てがたいとは思いますが、今となっては、
> Regex を使った方が被害が少ないかと思います。

今回の件に関しては、回避方法自体は特に案があるので問題はないのですが、
魔界の仮面弁士さんのいう通り正規表現による対応を軸に
進めていこうと思います。



本件の主目的である

>>上に報告する際に、なぜそのような事が起きているか理由が分からず



> ? は「任意の1文字」を意味します。
> * は「0文字以上の任意の文字列」を意味します。
>
> すなわち "?*一田" は、最低でも 3 文字無ければいけないので、
> 本来は False となるべきであり、VB2008 の実装が誤っています。
>
> 他にも、「"b" Like "*a*b"」が True になってしまう不具合が報告されています。
> https://connect.microsoft.com/VisualStudio/feedback/details/748415/

これを元に理由を説明しようと思います。


また、合わせて正常に動作している(であろう)Likeについても
全体的に細かく見直してみようと思います。


ものの数時間というスピード解決できたことに、
魔界の仮面弁士さんには、大変感謝しております。
ありがとうございました。
(解決に1週間くらいはかかると踏んでいたのですが、(笑))

解決済み
引用返信 編集キー/
■69728 / inTopicNo.4)  Re[3]: VB6とVB.NETのLike演算子の違いについて
□投稿者/ 魔界の仮面弁士 (511回)-(2014/01/24(Fri) 17:56:22)
No69727 (an さん) に返信
> テキストモードにおける濁点半濁点の処理が、正しく行われなない

関連情報として:
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200702/07020021.txt
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200908/09080033.txt
解決済み
引用返信 編集キー/
■69750 / inTopicNo.5)  Re[4]: VB6とVB.NETのLike演算子の違いについて
□投稿者/ an (24回)-(2014/01/27(Mon) 17:05:42)
No69728 (魔界の仮面弁士 さん) に返信
> ■No69727 (an さん) に返信
>>テキストモードにおける濁点半濁点の処理が、正しく行われなない
>
> 関連情報として:
> http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200702/07020021.txt
> http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200908/09080033.txt

さらなる情報ありがとうございます。
大変興味深い内容でした。



解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -