2014-09-29 12 views
6

Przy użyciu C#, pobieram wartość TextBox.Text ze strony .ascx. Kiedy porównam równość wartości do zwykłego obiektu napisanego w zapytaniu LINQ, zawsze zwraca on wartość false.C# - Porównywanie ciągów różnych kodowań

Doszedłem do wniosku, że są one różnie zakodowane, ale jak dotąd nie miały szczęścia w ich przekształcaniu lub porównywaniu.

docname = "Testdoc 1.docx"; //regular string created in C# 
fetchedVal = ((TextBox)e.Item.FindControl("txtSelectedDocs")).Text; //UTF-8 

Powyższe dwa ciągi są identyczne, jeśli reprezentowane literałach, ale w porównaniu z byte[] są oczywiście różne w wyniku kodowania.

Próbowałem wiele różnych rzeczy, takich jak:

System.Text.Encoding.Default.GetString(utf8.GetBytes(fetchedVal)); 

jednak, że zwróci wartość "Testdoc 1.docx".

Gdybym zamiast próbować

System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(fetchedVal)); 

powraca "Testdoc 1.docx" ale Equals() -Check nadal zwraca false.

Próbowałem również następujące dane, które wydają się być zalecane podejście, ale bez powodzenia:

byte[] utf8Bytes = Encoding.UTF8.GetBytes(fetchedVal); 
byte[] unicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Bytes); 
string fetchedValConverted = Encoding.Unicode.GetString(unicodeBytes); 

Sprawca wydaje się być spacje, ponieważ badając sekwencję bajtów to zawsze siódmy bajt to się różni.

Jak poprawnie przekonwertować kodowanie UTF-8 do domyślnego w C#?

+0

Nie jestem pewien, jaki jest dokładnie tutaj problem, ale chcę skierować cię do funkcji Normalize napisu. Nie wiem, czy to rozwiąże problem, ale może być przydatne, aby znormalizować ciągi przed porównaniem ich. http://msdn.microsoft.com/en-us/library/system.string.normalize(v=vs.110).aspx –

+0

Zobacz odpowiedź @SLaks, nie ma to związku z kodowaniem. W .NET wszystkie ciągi są równe, a mianowicie kodowanie Unicode w UTF-16. Winowajcą jest niepodzielona przestrzeń, zobacz [Kody HTML - zamiast " "] pojawia się znak "Â" (http://stackoverflow.com/questions/1461907/html-encoding-issues-%C3% 82-znakowy pokaz-up-zamiast-nbsp). Gdzie jest wklejony ten tekst w skrytce tekstowej i jak jest wysyłany? – CodeCaster

+1

Podobnie jak w odpowiedzi na @DavidS., Również odkryłem funkcję 'Normalize', bez powodzenia. @CodeCaster, "TextBox.Text" jest ustawiony z JQuery. Brakowało mi tego, że może to być spowodowane! –

Odpowiedz

6

Łańcuchy nie mają kodowań ani tablic bajtowych. Kodowanie wchodzi w grę tylko po przekonwertowaniu ciągu znaków na tablicę bajtów; możesz to zrobić, określając kodowanie, którego użyjesz do wybrania bajtów.

Wygląda na to, że masz po prostu różne znaki w swoich ciągach. Możesz mieć niewidzialną postać w jednym z nich lub mogą mieć różne postacie, które wyglądają tak samo.

Aby dowiedzieć się, spójrz na wartości kodu Unicode każdego znaku w każdym ciągu znaków (np. (int) str[0]).

+0

Wydaje się to bardzo prawdopodobne, że zajrzę do tego od samego rana! –

+0

To był problem. W pewnym sensie znak spacji (' ', 'U + 0020') był w rzeczywistości przestrzenią bez łamania ('   '). –