2014-09-29 15 views
6

Mit C#, ich hole einen TextBox.Text Wert von einer .ascx-Seite. Wenn ich die Gleichheit des Werts mit einem regulären String-Objekt innerhalb einer LINQ-Abfrage vergleiche, gibt es immer false zurück.C# - Vergleichen von Zeichenfolgen verschiedener Kodierungen

Ich bin zu dem Schluss gekommen, dass sie unterschiedlich kodiert sind, aber bisher kein Glück hatten, sie zu konvertieren oder zu vergleichen.

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

Die beiden oben genannten Strings identisch sind, wenn sie als Literale dargestellt, aber die byte[] vergleichen sie sind offensichtlich unterschiedlich aufgrund der Codierung.

Ich habe eine Menge verschiedenen Dinge ausprobiert, wie zum Beispiel:

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

aber das wird den Wert "Testdoc 1.docx" zurückzukehren.

Wenn ich stattdessen

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

es gibt "Testdoc 1.docx" aber eine Equals() -check noch false zurückgibt.

Ich habe auch die folgende versucht, die die empfohlene Vorgehensweise zu sein scheinen, aber ohne Glück:

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

Der Täter scheint das Leerzeichen zu sein, denn wenn die Byte-Reihenfolge der Prüfung ist es immer das siebte Byte das ist anders.

Wie konvertiert man richtig von UTF-8 zu Standard-String-Codierung in C#?

+0

Ich bin nicht sicher, was genau das Problem hier ist, aber ich möchte Sie auf die Normalize-Funktion der Zeichenfolge verweisen. Ich weiß nicht, ob das dein Problem behebt, aber es könnte nützlich sein, die Strings vor dem Vergleich zu normalisieren. http://msdn.microsoft.com/en-us/library/system.string.normalize(v=vs.110).aspx –

+0

Siehe @SLaks Antwort, dies hat nicht mit der Codierung zu tun. In .NET sind alle Zeichenfolgen identisch, nämlich Unicode, das in UTF-16 codiert ist. Der Schuldige ist hier ein nicht-brechendes Leerzeichen, siehe [Probleme mit der HTML-Codierung - "Zeichen" anstelle von " "] (http://stackoverflow.com/questions/1461907/html-encoding-issues-%C3% 82-stelliges Zeichen-statt-von-nbsp). Woher kommt dieser Text in Ihrem Textfeld und wie wird er ausgegeben? – CodeCaster

+1

Nur als Antwort auf @DavidS. Habe ich auch die 'Normalize'-Funktion untersucht, ohne Erfolg. @CodeCaster, der 'TextBox.Text' wird von JQuery gesetzt. Ich habe die Tatsache übersehen, dass es daran liegen kann! –

Antwort

6

Strings haben keine Codierungen oder Byte-Arrays. Kodierungen kommen nur ins Spiel, wenn Sie eine Zeichenfolge in ein Byte-Array konvertieren; Sie können das nur tun, indem Sie angeben, welche Codierung für die Auswahl von Bytes verwendet werden soll.

Es hört sich so an, als hätten Sie tatsächlich einfach unterschiedliche Zeichen in Ihren Strings. Sie könnten einen unsichtbaren Charakter in einem von ihnen haben, oder sie könnten verschiedene Charaktere haben, die gleich aussehen.

Um dies herauszufinden, sehen Sie sich die Unicode-Codepunktwerte jedes Zeichens in jeder Zeichenfolge an (z. B. (int) str[0]).

+0

Dies erscheint sehr plausibel, ich werde es als erstes am Morgen untersuchen! –

+0

Das war das Problem. Irgendwie war ein Leerzeichen (' ', 'U + 0020') tatsächlich ein nicht-brechendes Leerzeichen ('   '). –

Verwandte Themen