質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

911閲覧

CompareInfo.IndexOfの挙動が開発サーバーとクライアントで異なる

ulmto

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/10/02 01:28

キーワード検索でひらがなとカタカナ・全角のカタカナと半角のカタカナ・ローマ字の小文字と大文字を区別せずにあいまい検索をして、検索に引っかからない明細行は非表示にするという処理を追加機能するために、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/10/02 01:58

何を何で作っているかぐらいは書けませんか? (例: Visual Studio 2022 で ASP,NET Core MVC アプリをターゲットフレームワーク .NET 6.0 で作っています) > 開発サーバーでは、すべて正しく実行されるのですが、クライアントPCでは 「開発サーバー」って何ですか? 「クライアントPC」と何が違うのですか? あなたの環境がさっぱり分かりません。
退会済みユーザー

退会済みユーザー

2022/10/02 02:04 編集

> あいまい検索をして、検索に引っかからない 「あいまい検索」ということは DB サーバーに WHERE LIKE 句付きの SQL 文を投げて結果を取得してるのでは? であれば DB サーバーが何か、照合順序はどうなっているかも書きましょう。 そのあたりのコードも書いてください。
KOZ6.0

2022/10/02 02:09

CurrentCulture だと環境に依存するので CompareInfo.GetCompareInfo("ja-JP") を使うとどうでしょう?
ulmto

2022/10/02 02:51

すみません、開発サーバーとクライアントPCで環境の違いは確認していませんでした。会社に出社したら確認します。
ulmto

2022/10/02 02:53

あいまい検索はIndexOfの処理で行なっているという意味です。sqlは使っていません。わかりにくくてすみません。
ulmto

2022/10/02 02:54

CompareInfo.GetCompareInfo("ja-JP")は試してみましたが、結果は変わりませんでした。記述してなくて、すみません。
退会済みユーザー

退会済みユーザー

2022/10/02 02:59

質問に答えてもらえませんか。でないと話が噛み合わないとか通じなくなります。質問を再掲します。 何を何で作っているかぐらいは書けませんか? (例: Visual Studio 2022 で ASP,NET Core MVC アプリをターゲットフレームワーク .NET 6.0 で作っています) > 開発サーバーでは、すべて正しく実行されるのですが、クライアントPCでは 「開発サーバー」って何ですか? 「クライアントPC」と何が違うのですか? あなたの環境がさっぱり分かりません。
ulmto

2022/10/02 03:14

現在では確認できないので、わかりません
ulmto

2022/10/02 08:47

不具合は提示したコード以外になさそうです。
KOZ6.0

2022/10/02 09:18

そうですか、では不具合が解消されるのを待つか、自前でロジックを実装するしかないでしょう。 LCMapString API で、検索対象と検索文字列の双方を「全角ひらがな」か「全角カタカナ」に変換して IndexOf を実行すれば良いかと。 「文字列の全角・半角変換」 https://qiita.com/tricogimmick/items/5640798024837b782476 でもこの API に不具合が出てる可能性もあるので、その場合は変換ロジックも自前で実装ということになりますね。
ulmto

2022/10/02 09:34

このような方法があったのですね!ありがとうございます!!! 試してみます!
退会済みユーザー

退会済みユーザー

2022/10/03 02:24

> 開発サーバーとクライアントPCで環境の違いは確認していませんでした。会社に出社したら確認します。 確認しましたか? 確認結果を書いてください。
退会済みユーザー

退会済みユーザー

2022/10/03 13:28

質問者さん、無言ですが、回答したのでそれに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
退会済みユーザー

退会済みユーザー

2022/10/04 06:29

> この辺の話なんですかね? 「開発サーバー」と「クライアントPC」では OS が違うのであれば、結果に違いが出ても不思議はないですね。質問者は「会社に出社したら確認します」と言ったきり無言なのでどうなのか分かりませんけど。 ちなみに、試してみましたけど Windows 10 で -1 でした。記事は 0 だそうですが・・・ "\uFF8C\uFF67\uFF7D\uFF9E\uFF65\uFF77\uFF9E\uFF80\uFF70" ファズ・ギター "\u30D5\u30A1\u30BA\u30FB\u30AE\u30BF\u30FC"       ファズ・ギター
KOZ6.0

2022/10/04 06:50

>ちなみに、試してみましたけど Windows 10 で -1 でした。記事は 0 だそうですが・・・ 私の環境(Windows 10 LTSC)では 0 が返ってきました。 安定版なので Windows Update によるバージョンアップは遅めで、ICU.dll は配布されていません。
KOZ6.0

2022/10/04 07:41

winver で確認するとバージョン 1607(OSビルド 14393.5356)でした。(かなり古い) どこかで修正が入って動きが変わっていそうです。
退会済みユーザー

退会済みユーザー

2022/10/04 07:43

上に、 > ちなみに、試してみましたけど Windows 10 で -1 でした。 と書きましたけど、それは .NET 6.0 の場合で、.NET Framework 4.8 の場合は 1 という結果になりました。どうなってるのでしょう? 追及する気力がないのでここらでやめときます。
guest

回答1

0

IgnoreKanaType, IgnoreWidthが正しく実行されず、「あ」と「ア」、「ア」と「ア」が区別されてしまいます。

質問に返事がないので、質問者が何をしているのか、環境は何かが不明ですが、自分が .NET Framework 4.8 と .NET 6.0 で試した限りではそんなことはないので、何かの勘違いが疑わしいです。

自分が試したことを以下に書いておきます。

環境

Windows 10 Pro 64-bit 21H2 日本語版
Visual Studio Community 2022 v17.3.5
.NET Framework 4.8 と .NET 6.0 のコンソールアプリ

コード

.NET Framework 4.8 のコンソールアプリのものです。.NET 6.0 でも結果は同じです。

using System; using System.Linq; using System.Globalization; namespace ConsoleAppLinq2 { internal class Program { // 2022/10/3 Teratail の検証用 // https://teratail.com/questions/5ksofrrqtbyszi static void Main(string[] args) { string[] testStrings2 = new string[] { "カタカナ", "カタカナ", "abcdef", "ABCDEF", "ひらがな", "ヒラガナ" }; CompareOptions option = CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth; string string2 = "カタカナ"; var result2 = testStrings2.Where(s => MyCompare(s, string2, option)); foreach (string str in result2) { Console.WriteLine(str); } Console.WriteLine("-----------------------------------"); string2 = "abcdef"; result2 = testStrings2.Where(s => MyCompare(s, string2, option)); foreach (string str in result2) { Console.WriteLine(str); } Console.WriteLine("-----------------------------------"); string2 = "ひらがな"; result2 = testStrings2.Where(s => MyCompare(s, string2, option)); foreach (string str in result2) { Console.WriteLine(str); } } static bool MyCompare(string string1, string string2, CompareOptions option) { CompareInfo compInfo = CultureInfo.CurrentCulture.CompareInfo; int result = compInfo.Compare(string1, string2, option); if (result == 0) { return true; } else { return false; } } } }

結果

イメージ説明

投稿2022/10/03 04:40

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問