- PR -

C#のString.IndexOfの仕様

投稿者投稿内容
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-02-05 12:58
引用:
こういうときソースが見れないのはつらいところです。

一応見るツールがありますよ(ILをC#に変換する)。全ては見れないかもしれませんが。
http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_02.html
(StringはMscorlib.dll内ですね)
#見ましたが、私には複雑で、解析する気は起きませんでした・・

確かに「〇」の処理がおかしいメソッドがいくつかありますね。
中で使ってる共通の処理か何かがおかしいのでしょうかね。

[ メッセージ編集済み 編集者: べる 編集日時 2005-02-05 13:00 ]
@echo
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2005-02-05 13:53
ありがとうございます。"Reflector" ですね。
リソース見るぐらいにしか使ってませんでした。(^^;;

で、追いかけてみましたが、CompareInfo の

[MethodImpl(MethodImplOptions.InternalCall)]
private static extern unsafe int IndexOfString(...

の宣言で終わってしまいました...(中身なし)
Milan
常連さん
会議室デビュー日: 2005/01/05
投稿数: 33
投稿日時: 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 ]

スキルアップ/キャリアアップ(JOB@IT)