- - PR -
C#のString.IndexOfの仕様
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-02-04 18:24
文字列を操作する箇所でわからない動作をする箇所がありましたので、
もしわかる方がいらっしゃいましたら教えてください。 以下のような箇所でなぜか無限ループが発生してしまいます。
なぜかこれで無限ループが発生してしまいます。 ステップ実行で見ると、while文の条件内のIndexOfの戻り値が整数(−−が見つかった) と認識されてしまってるようなのですが、 実際のデータには−−は含まれないのでReplaceでは何も起きなくて、 延々とループになってるようです。 −−に一致してると見なされるのは−と英字の並ぶ辺りなのですが、 −と英字が並んで−−に一致すると見なされるようなことはあるのでしょうか? また、これは文字コードが何かからんでる問題なのでしょうか? もしこれの原因に思い当たる方がいらっしゃいましたら、どうぞご教授をお願いいたします。 | ||||
|
投稿日時: 2005-02-04 18:44
じゃんぬねっと です。
のラストの「〇−」が原因ですね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-02-04 19:19
>じゃんぬねっと様
早速のご指摘ありがとうございます。
とのことでしたので、"○"と"−"を見てみたところ、上位ビットが同じでした。 この辺りが原因なのでしょうか? 実はまだあまり理解してませんが、ループに回数制限をすればよいと気づいたので、 一応作業は先に進みました。 一息ついたらまた少しつっこんで見てみたいと思います。 ありがとうございました。 | ||||
|
投稿日時: 2005-02-04 20:20
少し実験してみました。
処理結果: "AA".IndexOf("〇A") => 1 "AA".IndexOf("〇") => 0 "A〇A".IndexOf("AA") => 0 "〇A〇A".IndexOf("AA") => 1 "〇A〇A".IndexOf("〇A") => 0 "〇A〇A".LastIndexOf("〇A") => 3 '〇' という文字はまともに処理されていないような気がするのですが... Google してみても見つかりませんでしたが、何か特殊な仕掛けが あるのでしょうか? | ||||
|
投稿日時: 2005-02-04 20:22
こんにちは。
"〇"文字に問題があるみたいです。(U+3007) ----------------------------------------------------- string target_text = "千代田区丸の内一−Oct−〇〇−"; target_text.IndexOf("〇"); → 0 target_text.IndexOf(String.Empty); → 0 ----------------------------------------------------- 同じ結果返ってきます。 "−〇〇−"の"〇〇"が無視されて"−−"になり ヒットし無限ループしてるように思います。 [ メッセージ編集済み 編集者: Milan 編集日時 2005-02-06 00:24 ] | ||||
|
投稿日時: 2005-02-04 20:45
> String.IndexOf(String.Empty);
> と同じ結果(ゼロ)が返ってきます。 なるほど! String.Empty と同じ扱いなんですね!? ...って納得していいんでしょうか...(^^; 1. '〇' が String.Empty と同じ扱いなのは仕様なのでしょうか? 2. "xxx".IndexOf(String.Empty) == 0 は仕様としては正しいのでしょうか? ご存知の方いらっしゃいますか? | ||||
|
投稿日時: 2005-02-05 01:07
1は仕様ではないと思います。 おそらく、IndexOfメソッドのバグなんではないでしょうか。 LastIndexOf("〇")は正しく値が・・・(間違い、常に最後のIndexが返される) 2は仕様です。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemstringclassindexoftopic2.asp [ メッセージ編集済み 編集者: Milan 編集日時 2005-02-06 00:19 ] | ||||
|
投稿日時: 2005-02-05 08:35
ありがとうございます。
> おそらく、IndexOfメソッドのバグなんではないでしょうか。 ですよね。こういうときソースが見れないのはつらいところです。 > LastIndexOf("〇")は正しく値が帰ってきます。 "AAA".LastIndexOf"〇") = 2 なので誤っていますね。 IndexOf, LastIndexOf 共 NG です。 > 2は仕様です。 おおっ! 見落としていました。ありがとうございます。 [ メッセージ編集済み 編集者: suz21426 編集日時 2005-02-05 08:37 ] |