2012-05-10 11 views
16

私は次のコードを持っている:任意:なぜ文脈によってstring.Normalizeが一貫していないのですか?

string input = "ç"; 
string normalized = input.Normalize(NormalizationForm.FormD); 
char[] chars = normalized.ToCharArray(); 

を私はユニットテストプロジェクト(プラットフォームでそれを実行7.

64ビットのWindows上で、Visual Studioの2010 .net4をこのコードをビルドしますCPU)2つのコンテキストでとcharsの内容を確認してください。

  • Visual Studioのユニットテスト:文字は{ 231 }が含まれています。
  • ReSharper:charsには、{ 231 }が含まれます。
  • NCrunch:charsには{ 99, 807 }が含まれます。

msdn documentationでは、さまざまな動作を示す情報が見つかりませんでした。

なぜ、私は違う行動を取るのですか?私の場合、NCrunchの動作は予期された動作ですが、他の動作も同様です。

編集: 私は3.5に戻って同じ問題があります。 String.Normalize(NormalizationForm) documentation

+0

ええと、私はVisual Studioで{99、807}を取得します...これはあなたのプロジェクトの設定について何かがあることを意味します...たぶん。 – zmilojko

+0

@zmilojko。あなたのテストに感謝します。私は空白の新しいプロジェクトであなたと同じ結果を得ます。だから私は2つのプロジェクト(csprojのwinmerge)の違いを確認していますが、関連性がまだ見つかりませんでした。これが私がこの質問を投稿した理由です。 – remio

+5

それぞれの場合に 'Thread.CurrentThread.CurrentCulture'とは何ですか? – AakashM

答えて

7

それは

バイナリ表現が normalizationFormパラメータで指定された正規化された形態であることを述べています。

これは両方のケースでFormDの正規化を使用していることを意味します。したがって、CurrentCultureなどは本当に問題ではありません。

私が考えることができる唯一のものは、 "ç"文字です。その文字は、Visual Studioソースコードファイル用に想定または設定された文字エンコードごとに解釈されます。要するに、私はNCrunchが他のものとは異なるソースファイルエンコーディングを想定していると思います。

NCrunchフォーラムのクイック検索に基づいて、いくつかのUTF-8→UTF-16変換の言及がありましたので、確認します。

+1

実際、ソースコード/ランタイムコードの文字列のエンコーディングが強く疑われていました。私は運がないソースファイルのエンコーディングを始めました。次に、外部ファイルから文字列を読み取ろうとしましたが、これは強制的にUTF-8にエンコードするまで失敗しました。最後に、 'input 'の宣言を' string input = new string(new [] {(char)231}); 'に更新しました。 – remio

関連する問題