2010-06-18 13 views
7

Potrzebuję pełnego adresu URL Zakoduj adres e-mail.Kodowanie wszystkich nie alfabetycznych w języku C#

HttpUtility.UrlEncode wydaje się ignorować pewne znaki, takie jak! i .

trzeba przekazać adres e-mail w adresie URL formatowany tak:

/Users/[email protected]/Comments 

Ponieważ mój szablon WebMethod uri wygląda następująco:

[WebGet(UriTemplate = "Users/{emailAddress}/Comments")] 

WCF przerw okres i nie przejdzie adres e-mail do mojej metody usługi internetowej REST. Usunięcie okresu kończy się pomyślnie. Mam nadzieję, że istnieje metoda, która będzie kodować wszystkie znaki alfanumeryczne, ponieważ wszystko, co zużywa tę usługę, będzie musiało to zrobić.

EDIT

ja uważane za pomocą:

Convert.ToBase64String(Encoding.ASCII.GetBytes("[email protected]")) 

Czy większość innych języków mają proste sposoby, aby przekonwertować ciąg base64? Moją główną obawą jest to, że nasi klienci, którzy korzystają z tej usługi, będą musieli kodować adres e-mail za pomocą Java, PHP, Ruby, itp.

+0

trochę zreformowany. – Femaref

+0

Jakiego błędu dostałeś? –

+0

Nie znaleziono A 404 – Vyrotek

Odpowiedz

0

Odkryłem rozwiązanie tego problemu.

.Net 4.0 naprawił problem za pomocą znaków specjalnych w szablonie URI.

Ten wątek skierował mnie we właściwym kierunku. http://social.msdn.microsoft.com/Forums/en/dataservices/thread/b5a14fc9-3975-4a7f-bdaa-b97b8f26212b

Dodałem wszystkie ustawienia konfiguracji i zadziałało. Ale uwaga: działa TYLKO z PRAWDZIWĄ konfiguracją IIS z .Net 4.0. Nie mogę sprawić, żeby działało z Visual Studio Dev IIS.

Aktualizacja - Właściwie próbowałem usunąć te ustawienia konfiguracji i nadal działa. Być może to dlatego, że .Net 4.0 naprawił ten problem domyślnie.

0

Użyj hex. Istnieje ConvertTo and a From i próbny test ...

Można również po prostu scape znaki, które nie pasują od A do Z, używając wyrażeń regularnych, aby Twój adres URL nadal wyglądał ładnie.

on powróci dużą listę numerów, więc powinno być dobrze

 public static string ConvertToHex(string asciiString) 
    { 
     var hex = ""; 
     foreach (var c in asciiString) 
     { 
      int tmp = c; 
      hex += String.Format("{0:x2}", Convert.ToUInt32(tmp.ToString())); 
     } 
     return hex; 
    } 

    public static string ConvertToString(string hex) 
    { 
     var stringValue = ""; 
     // While there's still something to convert in the hex string 
     while (hex.Length > 0) 
     { 
      stringValue += Convert.ToChar(Convert.ToUInt32(hex.Substring(0, 2), 16)).ToString(); 
      // Remove from the hex object the converted value 
      hex = hex.Substring(2, hex.Length - 2); 
     } 

     return stringValue; 
    } 

    static void Main(string[] args) 
    { 
     string hex = ConvertToHex("[email protected]"); 
     Console.WriteLine(hex); 
     Console.ReadLine(); 
     string stringValue = 
     ConvertToString(hex); 
     Console.WriteLine(stringValue); 
     Console.ReadLine(); 

    } 
2

Oto potencjał Regex można użyć, aby wykonać kodowanie.

Regex.Replace(s, @"[^\w]", m => "%" + ((int)m.Value[0]).ToString("X2"));

nie jestem pewien, że istnieje metoda istniejących ram ściśle zdefiniowane kodować wszystkie znaki inne niż alfanumeryczne, które można wskazują swoim klientom.

0

O ile się nie mylę, Kodowanie URL to po prostu znak procent następnie numer ASCII (szesnastkowo), więc to powinno działać ...

Dim Encoded as New StringBuilder() 

For Each Ch as Char In "[email protected]" 
    If Char.IsLetterOrDigit(Ch) 
     Encoded.Append(Ch) 
    Else 
     Encoded.Append("%") 
     Dim Byt as Byte = Encoding.ASCII.GetBytes(Ch)(0) 
     Encoded.AppendFormat("{0:x2}", Byt) 
    End If 
Next 

Powyższe wyniki kodu w something%2Bme%40example.com

+0

Przepraszam, że używam VB.NET, ale możesz to łatwo zmienić: http://codechanger.com/ –

+0

Jak byś to zdekodował? – Vyrotek

+0

@Vyrotek Możesz na tym polegać 'Uri.UnescapeDataString()'. –

Powiązane problemy