Почему нет string.Normalize в зависимости от контекста?

У меня есть следующий код:

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

Я создаю этот код с Visual studio 2010,.net4, на 64-битных окнах 7.

Я запускаю его в проекте единичных тестов (платформа: любой процессор) в двух контекстах и ​​проверяю содержимое chars:

  • Модульные тесты Visual Studio: символы содержат { 231 }.
  • ReSharper: символы содержат { 231 }.
  • NCrunch: chars содержит { 99, 807 }.

В msdn documentation я не мог найти никакой информации, представляющей разные типы поведения.

Итак, почему у меня другое поведение? Для меня поведение NCrunch является ожидаемым, но я ожидал бы то же самое для других.

Edit: Я переключился на .Net 3.5 и по-прежнему имею ту же проблему.

Ответы

Ответ 1

В документации String.Normalize(NormalizationForm) говорится, что

двоичное представление находится в форме нормализации, заданной normalizationForm.

что означает, что вы должны использовать нормализацию FormD в обоих случаях, поэтому CurrentCulture и тому подобное не должны иметь значения.

Единственное, что может измениться, то, о чем я могу думать, это символ "ç". Этот символ интерпретируется как кодировка символов, которая либо предполагается, либо сконфигурирована для файлов исходного кода Visual Studio. Короче говоря, я думаю, что NCrunch предполагает различную кодировку исходного файла, чем другие.

Основываясь на быстром поиске на форуме NCrunch, было упоминание о некотором преобразовании UTF-8 → UTF-16, поэтому я бы это проверить.