キーワード検索でひらがなとカタカナ・全角のカタカナと半角のカタカナ・ローマ字の小文字と大文字を区別せずにあいまい検索をして、検索に引っかからない明細行は非表示にするという処理を追加機能するために、CompareInfo.IndexOfメソッドを使って以下のような処理を実行しました。
すると、開発サーバーでは、すべて正しく実行されるのですが、クライアントPCでは、IgnoreKanaType, IgnoreWidthが正しく実行されず、「あ」と「ア」、「ア」と「ア」が区別されてしまいます。(IgnoreCaseは開発サーバーもクライアントPCでも正しく実行されました。)
ネットで調べてみても、同じような現象を発見できず、解決方法に困っています。
それとも、CompareInfo.IndexOfメソッドは諦めて、別の方法で組んだ方がよいでしょうか?
原因、解決策のご教授お願いいたします。
c#
1 2System.Globalization.CompareInfo ci = System.Globalization.CultureInfo.CurrentCulture.CompareInfo; 3 4// 明細行ループ文開始 5 6int num4 = ci.IndexOf(search, textBox2.Text, 7 System.Globalization.CompareOptions.IgnoreKanaType | 8 System.Globalization.CompareOptions.IgnoreCase | 9 System.Globalization.CompareOptions.IgnoreWidth) ; 10 11if (num4 == -1) 12{ 13// 明細行非表示 14} 15 16// 明細行ループ文終了 17
何を何で作っているかぐらいは書けませんか? (例: Visual Studio 2022 で ASP,NET Core MVC アプリをターゲットフレームワーク .NET 6.0 で作っています)
> 開発サーバーでは、すべて正しく実行されるのですが、クライアントPCでは
「開発サーバー」って何ですか? 「クライアントPC」と何が違うのですか? あなたの環境がさっぱり分かりません。
> あいまい検索をして、検索に引っかからない
「あいまい検索」ということは DB サーバーに WHERE LIKE 句付きの SQL 文を投げて結果を取得してるのでは? であれば DB サーバーが何か、照合順序はどうなっているかも書きましょう。
そのあたりのコードも書いてください。
CurrentCulture だと環境に依存するので CompareInfo.GetCompareInfo("ja-JP") を使うとどうでしょう?
すみません、開発サーバーとクライアントPCで環境の違いは確認していませんでした。会社に出社したら確認します。
あいまい検索はIndexOfの処理で行なっているという意味です。sqlは使っていません。わかりにくくてすみません。
CompareInfo.GetCompareInfo("ja-JP")は試してみましたが、結果は変わりませんでした。記述してなくて、すみません。
質問に答えてもらえませんか。でないと話が噛み合わないとか通じなくなります。質問を再掲します。
何を何で作っているかぐらいは書けませんか? (例: Visual Studio 2022 で ASP,NET Core MVC アプリをターゲットフレームワーク .NET 6.0 で作っています)
> 開発サーバーでは、すべて正しく実行されるのですが、クライアントPCでは
「開発サーバー」って何ですか? 「クライアントPC」と何が違うのですか? あなたの環境がさっぱり分かりません。
現在では確認できないので、わかりません
Windows Update で .NET Framework に修正が入り、CombBox に不具合が出たことがあります。
https://social.msdn.microsoft.com/Forums/ja-JP/1d3c82db-6544-4b04-b8b6-d0084a30dc56/combobox123981248612461124731248812364windows-10?forum=netfxgeneralja
同じ類なのかもしれませんが、提示されたコード以外で不具合が発生している可能性はないですか?
不具合は提示したコード以外になさそうです。
そうですか、では不具合が解消されるのを待つか、自前でロジックを実装するしかないでしょう。
LCMapString API で、検索対象と検索文字列の双方を「全角ひらがな」か「全角カタカナ」に変換して IndexOf を実行すれば良いかと。
「文字列の全角・半角変換」
https://qiita.com/tricogimmick/items/5640798024837b782476
でもこの API に不具合が出てる可能性もあるので、その場合は変換ロジックも自前で実装ということになりますね。
このような方法があったのですね!ありがとうございます!!!
試してみます!
> 開発サーバーとクライアントPCで環境の違いは確認していませんでした。会社に出社したら確認します。
確認しましたか? 確認結果を書いてください。
質問者さん、無言ですが、回答したのでそれに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
この辺の話なんですかね?
[Different handling of comparison options between NLS and ICU · Issue #18912 · dotnet/runtime](https://github.com/dotnet/runtime/issues/18912)
> この辺の話なんですかね?
「開発サーバー」と「クライアントPC」では OS が違うのであれば、結果に違いが出ても不思議はないですね。質問者は「会社に出社したら確認します」と言ったきり無言なのでどうなのか分かりませんけど。
ちなみに、試してみましたけど Windows 10 で -1 でした。記事は 0 だそうですが・・・
"\uFF8C\uFF67\uFF7D\uFF9E\uFF65\uFF77\uFF9E\uFF80\uFF70" ファズ・ギター
"\u30D5\u30A1\u30BA\u30FB\u30AE\u30BF\u30FC" ファズ・ギター
>ちなみに、試してみましたけど Windows 10 で -1 でした。記事は 0 だそうですが・・・
私の環境(Windows 10 LTSC)では 0 が返ってきました。
安定版なので Windows Update によるバージョンアップは遅めで、ICU.dll は配布されていません。
winver で確認するとバージョン 1607(OSビルド 14393.5356)でした。(かなり古い)
どこかで修正が入って動きが変わっていそうです。
上に、
> ちなみに、試してみましたけど Windows 10 で -1 でした。
と書きましたけど、それは .NET 6.0 の場合で、.NET Framework 4.8 の場合は 1 という結果になりました。どうなってるのでしょう? 追及する気力がないのでここらでやめときます。