- - PR -
C#のString.IndexOfの仕様
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-02-05 12:58
http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_02.html (StringはMscorlib.dll内ですね) #見ましたが、私には複雑で、解析する気は起きませんでした・・ 確かに「〇」の処理がおかしいメソッドがいくつかありますね。 中で使ってる共通の処理か何かがおかしいのでしょうかね。 [ メッセージ編集済み 編集者: べる 編集日時 2005-02-05 13:00 ] | ||||
|
投稿日時: 2005-02-05 13:53
ありがとうございます。"Reflector" ですね。
リソース見るぐらいにしか使ってませんでした。(^^;; で、追いかけてみましたが、CompareInfo の [MethodImpl(MethodImplOptions.InternalCall)] private static extern unsafe int IndexOfString(... の宣言で終わってしまいました...(中身なし) | ||||
|
投稿日時: 2005-02-06 00:13
この問題は、カルチャが関係しているのかなと思って調べていたのですが
これはって思ったのは ------------------------------------------------------- String.Empty == "〇"; → False; String.Compare( String.Empty, "〇" ); → 0(※) String.CompareOrdinal( String.Empty, "〇" ); → -1 ------------------------------------------------------- だからIndexOfも・・・ StringクラスのIndexOfメソッドは CompareInfoのIndexOfメソッドを内部で呼び出しています。 そのメソッドにCompareOptions(列挙体)を指定できるのですが、 そこにCompareOptions.Ordinal指定すると正しく処理されます。 --- CompareInfoクラスを使用するのも一つの手。 その他、代替としては StringクラスのIndexOfAnyメソッドを使用しても 正しく処理できるかと思います。 ------------------------------------------------------- string maru = "〇"; string target_text = "千代田区丸の内一−Oct−〇〇−"; char[] maru_c = maru.ToCharArray(); target_text.IndexOfAny( maru_c ); ------------------------------------------------------- 個人的には正規表現でやるのがスッキリする気がします。 余談ですが、"〇"文字(U+3007)は "IDEOGRAPHIC NUMBER ZERO"って名前みたいです --- 最後に前に投稿したあいまいな情報は 紛らわしいので修正しておきます。 ご指摘ありがとうございました。 [ メッセージ編集済み 編集者: Milan 編集日時 2005-02-06 00:14 ] |