2012-05-10 31 views
16

Ho il seguente codice:Perché non string.Normalizza coerentemente in base al contesto?

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

costruisco questo codice con Visual Studio 2010, .net4, su un 64 bit di Windows 7.

ho eseguito in un progetto di test di unità (piattaforma: Qualsiasi CPU) in due contesti e controllare il contenuto di chars:

  • di Visual Studio unit test: caratteri contiene { 231 }.
  • ReSharper: caratteri contiene { 231 }.
  • NCrunch: caratteri contiene { 99, 807 }.

Nel msdn documentation, non sono riuscito a trovare alcuna informazione che presenti comportamenti diversi.

Quindi, perché ottengo comportamenti diversi? Per me il comportamento NCrunch è quello previsto, ma mi aspetterei lo stesso per gli altri.

Modifica: Sono tornato a .Net 3.5 e ho ancora lo stesso problema.

+0

Hmm, ottengo {99, 807} con Visual Studio ... Ciò implicherebbe che c'è qualcosa nella configurazione del progetto ... Forse. – zmilojko

+0

@zmilojko. Grazie per il tuo test. Ottengo gli stessi risultati dei tuoi in un nuovo progetto vuoto. Quindi sto verificando le differenze tra i due progetti (winmerge su csproj), ma non sono riuscito a trovare ancora rilevante, il motivo per cui ho pubblicato questa domanda: capire quale contesto potrebbe indurre un comportamento diverso. – remio

+5

Che cosa è 'Thread.CurrentThread.CurrentCulture' in ogni caso? – AakashM

risposta

7

In String.Normalize(NormalizationForm) documentation si dice che

rappresentazione binaria è in forma di normalizzazione specificato dal parametro normalizationForm.

il che significa che si sta utilizzando la normalizzazione di FormD in entrambi i casi, quindi CurrentCulture e simili non dovrebbero interessare.

L'unica cosa che potrebbe cambiare, quindi, quello che posso pensare è il carattere "ç". Quel carattere è interpretato come per codifica dei caratteri che è presupposta o configurata per i file di codice sorgente di Visual Studio. In breve, penso che NCrunch stia assumendo la codifica di file sorgente diversa dalle altre.

Sulla base di una ricerca rapida sul forum NCrunch, c'era una menzione di alcuni UTF-8 -> UTF-16 di conversione, quindi vorrei verificarlo.

+1

In effetti, sospettavo fortemente la codifica del carattere te 'ç' nel codice sorgente/runtime. Ho iniziato a giocare con la codifica del file sorgente senza fortuna. Quindi, ho provato a leggere la stringa da un file esterno, che non è riuscito fino a quando non ho forzato la sua codifica a 'UTF-8'. Infine, ho aggiornato la mia dichiarazione di 'input' a' string input = new string (new [] {(char) 231}); ', e ... funziona! – remio