2012-05-10 17 views
16

Mam następujący kod:Dlaczego string.Normalize nie jest spójny w zależności od kontekstu?

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

buduję ten kod z Visual Studio 2010, .net4, na 64 bitowych Windows 7.

go uruchomić w projekcie testów jednostkowych (platformy: Dowolny CPU) w dwóch kontekstach i sprawdzić zawartość chars:

  • wizualne testów jednostkowych Studio: znaków zawierający { 231 }.
  • ReSharper: znaki zawierają { 231 }.
  • NCrunch: znaki zawierają numer { 99, 807 }.

W msdn documentation, nie mogłem znaleźć żadnych informacji prezentujących różne zachowania.

Dlaczego więc dostaję różne zachowania? Dla mnie zachowanie NCrunch jest oczekiwane, ale oczekiwałbym tego samego u innych.

Edytuj: Powróciłem do .Net 3.5 i nadal mam ten sam problem.

+0

Hmm, dostaję {99, 807} z Visual Studio ... To by sugerowało, że jest coś w konfiguracji twojego projektu ... Może. – zmilojko

+0

@zmilojko. Dziękuję za twoje testy. Otrzymuję takie same wyniki jak twoje w pustym nowym projekcie. Sprawdzam więc różnice między dwoma projektami (winmerge na csproj), ale nie mogłem jeszcze znaleźć, co było powodem, dla którego napisałem to pytanie: zrozum, który kontekst może wywołać inne zachowanie. – remio

+5

Co to jest "Thread.CurrentThread.CurrentCulture" w każdym przypadku? – AakashM

Odpowiedz

7

W String.Normalize(NormalizationForm) documentation mówi, że

reprezentacja binarna jest w postaci normalizacji określonym przez parametr normalizationForm.

co oznacza, że ​​w obu przypadkach stosujesz normalizację FormD, więc CurrentCulture i tak nie powinno mieć znaczenia.

Jedyne, co może się zmienić, to, co mogę myśleć, to postać "ç". Ten znak jest interpretowany zgodnie z kodowaniem znaków, które zostało założone lub skonfigurowane dla plików kodu źródłowego Visual Studio. Krótko mówiąc, myślę, że NCrunch zakłada inne kodowanie plików źródłowych niż inne.

Na podstawie szybkiego wyszukiwania na forum NCrunch wspomniano o pewnej konwersji UTF-8 -> UTF-16, więc sprawdziłbym to.

+1

Rzeczywiście, mocno podejrzewałem kodowanie znaku '' 'w kodzie źródłowym/uruchomieniowym. Zacząłem grać z kodowaniem pliku źródłowego bez powodzenia. Następnie próbowałem odczytać ciąg z pliku zewnętrznego, który zakończył się niepowodzeniem, dopóki nie zmusiłem jego kodowania do 'UTF-8'. Wreszcie zaktualizowałem swoją deklarację 'input' na' string input = new string (new [] {(char) 231}); ', i ... to działa! – remio