2013-06-28 11 views
17

この質問はC#、.NET Compact Framework 2およびWindows CE 5デバイスに適用されます。C#string.IndexOf()は予期しない値を返します

非常に異なるCEデバイスで使用されていた.net DLLに問題が発生していないバグが発生しました。突然、新しいWindows CE 5.0デバイス上で、このバグは、次のコードに登場:

string s = "Print revenue receipt"; // has only single space chars 
int i = s.IndexOf(" "); // two space chars 

私はindexOfのは突然5.

を返したとき、しかし、これは今日までだけ本当だった、私は-1であることを期待

int i = s.IndexOf(" ", StringComparison.Ordinal); 

を使用している場合、この現象は発生しませんので、私はこれは文化ベースphenomenomであることをかなり確信しているが、私は、この新しいデバイスが作る違いを認識することはできません。これは、既知のデバイス(ちょうど高速のCPUと新しいボード)とほとんど同じバージョンです。

両デバイス:同じ局在化と

  • 実行のWindows CE 5.0
  • System.Environment.Versionレポート '2.0.7045.0'
  • CultureInfo.CurrentUICultureとCultureInfo.CurrentCultureレポート 'エンGB' (「de-DE」でもテスト済み)
  • 「すべての」関連するレジストリキーは等しいです。

新しいデバイスにはCF 3.5がプリインストールされていました.GACファイルの名前は実験的に変更されていましたが、記述された動作に変更はありません。実行時には常にバージョン2.0.7045.0が報告されるので、これらのアセンブリは何の効果もないと仮定します。

これは修正するのが難しくありませんが、私はそれが魔法のように見えるときはそれに耐えられません。私は何が欠けていたかのヒント?

編集:それは見知らぬ人を取得し、見知らぬされ、スクリーンショットを参照してください。 screenshot

つ以上: screenshot

+0

あなたはこの_exact_コードを実行して5を取得しますか? –

+0

もちろん、上記の私のスクリーンショットを参照してください。私もその問題を修正しました。面白い点: * s = "収益の印刷"; //結果-1 * s = "Drucke Beleg aus"; //結果-1(!) plsは私の頻繁な編集を許しています。 –

+0

http://i.stack.imgur.com/iGxNb.png –

答えて

0

文化のものは、実際にいくつかのシステムではかなり魔法のように見えることができます。私が何年もの痛みを抱えていつもやったのは、です。いつもは文化情報を手動でInvariantCultureに設定しています。だから、私の提案は次のようになります。IndexOfチェックはいつものように、同じ文化情報を使用していることを確認してください:

int i = s.IndexOf(" ", StringComparison.InvariantCulture); 
+0

私もこれを試しましたが、同じ動作が現れました。 StringComparison.Ordinalだけがそれを修正しました。私は、週末が始まる前に重要な違いがどこに隠れているかを知る必要があります;-) なぜ、2つのスペースを1と同じように扱うことができるのかを理解することは非常に難しいようですが、 'string.Equals(" "、" ");' (2つのスペースと1つのスペース)はfalseを返します。 –

+0

'String.Equals'は序数比較を使用します。代わりに 'String.Compare(" "、" ")'を試してください。 – Mormegil

+0

String.Compareは1を返し、等しいと認識されません。 –

4

を私はすでにあなたは小さなを読むことができ

int i = s.IndexOf(" ", StringComparison.Ordinal); 

序検索を使って答えを持っていると信じてこのようString.StartsWithやString.IndexOfなど

文字列検索方法も、実行することができます。件名に言って、これを持っているString Classためのドキュメントのセクション文化的に敏感な、または序列比較。次の例は、IndexOfメソッドを使用した序数比較と文化依存比較の違いを示しています。現在の文化が英語(米国)である文化に敏感な検索では、部分文字列 "oe"が合字 " - "に一致すると見なされます。ソフトハイフン(U + 00AD)は幅がゼロの文字なので、検索ではソフトハイフンがEmptyと等価に扱われ、文字列の先頭に一致するものが検索されます。一方、序数検索では、いずれの場合も一致が見つかりません。

+2

これは「この問題を解決するにはどうすればよいですか」という質問に対する正解であることがわかりました。 - しかし、私の質問は: "なぜこれは起こっているのですか?" –

+0

私はあなたが問題の文字列の各文字をデバッグで繰り返すことをお勧めします。 –

+0

これは他のすべてのデバイスで動作する理由を説明できませんでした。バーコードエディタにコピー&ペーストすると、少なくともVSデバッガは隠し文字を提供しません。アルファベットの上のループの例に注意してください。 –

0

http://msdn.microsoft.com/en-us/library/k8b1470s.aspx状態における基準:

「文字セットは、言語、または文化に敏感な比較を行う際に考慮されていない文字である無視文字を含む培養物に敏感な検索では、値が含まれている場合。無視できる文字であれば、その文字を削除して検索するのと同じ結果になります。

これは4.5リファレンスであり、以前のバージョンのリファレンスにはそのようなものは含まれていません。

それでは、ルールを4.0から4.5に変更しました.2つのスペースシーケンスの2番目のスペースは、「無視できる文字」とみなされます。少なくとも、エンジンがあなたの文字列を英語テキスト(例の文字列sのようなもの)。

何とかあなたの新しいデバイスでは、期待される2.0 dllの代わりに4.5 dllが使用されます。

私は知っています:)

+0

非常に野生の推測ですが、合理的かつ教育を受けています。 System.Environment.Versionに2.0が表示されます。実行時には7045.0になるため、CF2 SP2が使用されます。このCF2インストールに加えて、CF3.5 DLLが追加で提供されています。 –

関連する問題