2013-06-05 10 views
5

Próbuję porównać dwa ciągi, ale jeden ciąg zawiera białe spacje na końcu. Użyłem Trim() i porównałem, ale nie zadziałało, ponieważ ta biała przestrzeń została przekształcona w% 20 i rzecz, którą Trim nie usuwa. to jest coś takiego, jak "abc" i "abc%20", co mogę zrobić w takiej sytuacji, aby porównać ciągi, które ignorują przypadek?sposób obsługi% 20 podczas porównywania ciągów w C#

+4

Używaj Server.UrlDecode ("abc% 20") przed porównania lub napisać własny comparer, które to obsługują. – Giedrius

Odpowiedz

4

%20 to zakodowana w url wersja przestrzeni.

Nie można bezpośrednio rozebrać go wyłączyć za pomocą Trim(), ale można użyć HttpUtility.UrlDecode() zdekodować %20 z powrotem do przestrzeni, a następnie przyciąć/zrobić porównanie dokładnie tak samo, jak w inny sposób;

using System.Web; 

//... 

var test1 = "HELLO%20"; 
var test2 = "hello"; 

Console.WriteLine(HttpUtility.UrlDecode(test1).Trim(). 
      Equals(HttpUtility.UrlDecode(test2).Trim(),    
      StringComparison.InvariantCultureIgnoreCase)); 

> true 
0

Czy próbowałeś tego?

string before = "abc%20"; 
string after = before.Replace("%20", "").ToLower(); 
0

Można użyć String.Replace a ponieważ wymienionym przypadku niewrażliwość String.ToLower tak:

var str1 = "abc"; 
var str2 = "Abc%20"; 
str1.Replace("%20", "").ToLower() == str2.Replace("%20", "").ToLower(); 
// will be true 
4

użytkowania HttpUtility.UrlDecode dekodować ciągi:

string s1 = "abc "; 
string s2 = "abc%20"; 
if (System.Web.HttpUtility.UrlDecode(s1).Equals(System.Web.HttpUtility.UrlDecode(s2))) 
{ 
    //equals... 
} 

w przypadku WinForms lub konsoli (lub dowolny inny niż ASP.NET), będziesz musiał dodać odniesienie do zespołu System.Web w swoim projekcie.

+0

'String.Equals' nie jest konieczne, możesz również użyć' == '. – ggPeti

+0

@ggPeti Wiem, używanie '.Equals()' jest po prostu bardziej czytelne dla moich oczu, więc gdy nie ma ryzyka 'null' s używam go. –

+0

Każdy na własną rękę! Uznałem, że OP uzna to za przydatne. – ggPeti

1

"%20" jest zakodowaną wersją adresu URL ' ' (spacja). Czy porównujesz zakodowany parametr adresu URL? Jeśli tak, możesz użyć:

string str = "abc%20"; 
string decoded = HttpUtility.UrlDecode(str); // decoded becomes "abc " 

Jeśli potrzebujesz przyciąć wszystkie białe spacje, powinieneś zrobić to dla dekodowanego ciągu. Metoda Trim nie rozpoznaje ani nie rozpoznaje zakodowanych znaków białych znaków.

decoded = decoded.Trim(); 

Teraz można porównać ze zmienną decoded używając:

decoded.Equals(otherValue, StringComparison.OrdinalIgnoreCase); 

StringComparison.OrdinalIgnoreCase jest prawdopodobnie najszybszym sposobem bez uwzględniania wielkości liter porównania ciągów.

1

Coś jak:

if (System.Uri.UnescapeDataString("abc%20").ToLower() == myString.ToLower()) {} 
+1

[Uwaga na to] (http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unecapedatastring-in-url-decoding.aspx) . –

+0

Masz rację, nie pomyślałem o tym. Dziękuję za poprawienie mnie. –

0

Wydaje się, że problemem jest korzeń, gdy jesteś z kodowaniem URL. Jeśli użyjesz kodowania znaków, nigdy nie otrzymasz% 20. Domyślne kodowanie używane przez HttpUtility.UrlEncode utf-8. tutaj jest wykorzystanie

System.Web.HttpUtility.UrlEncode("ãName Marcos", System.Text.Encoding.GetEncoding("iso-8859-1")) 

I Here, on Microsoft website można przeczytać więcej na temat kodowania znaków. A jeśli zrobisz prawidłowe kodowanie można uniknąć resztę pracy

A oto co pytasz -

drugim przypadku - jeśli trzeba porównać dwa ciąg jak na swoje potrzeby, trzeba rozszyfrować HttpUtility.Urldecode (test)

bool result = HttpUtility.UrlDecode(stringOne).Equals(HttpUtility.UrlDecode(stringOne)); 

I wynik bool wie, czy są one równe lub nierówne

Console.WriteLine("Result is", result ? "equal." : "not equal."); 

Nadzieja pomaga

Powiązane problemy