2010-06-18 8 views
7

Je dois encoder entièrement une adresse e-mail.URL Encoder tous les caractères non alphanumériques en C#

HttpUtility.UrlEncode semble ignorer certains caractères tels que! et .

J'ai besoin de transmettre une adresse e-mail dans une URL formated comme ceci:

/Users/[email protected]/Comments 

Parce que mon modèle WebMethod uri ressemble à ceci:

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

La pause de la période WCF et ne passera pas la adresse e-mail à ma méthode de service Web REST. Suppression de la période passe la valeur très bien. J'espère qu'il y a une méthode qui encodera tous les caractères non alphanumériques puisque tout ce qui consomme ce service devra le faire.

EDIT

j'avais envisagé d'utiliser:

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

faire la plupart des autres langues ont des façons de convertir facilement une chaîne à base64? Ma principale préoccupation est que nos clients qui consomment ce service devront encoder l'adresse e-mail en utilisant Java, PHP, Ruby, etc.

+0

réformé un peu. – Femaref

+0

Quel genre d'erreur obtenez-vous? –

+0

A 404 pas trouvé – Vyrotek

Répondre

0

J'ai découvert une solution à ce problème. .Net 4.0 a corrigé le problème avec des caractères spéciaux dans le modèle URI.

.

Ce fil m'a orienté dans la bonne direction. http://social.msdn.microsoft.com/Forums/en/dataservices/thread/b5a14fc9-3975-4a7f-bdaa-b97b8f26212b

J'ai ajouté tous les paramètres de configuration et cela a fonctionné. Mais notez, cela fonctionne UNIQUEMENT avec une installation réelle de IIS avec. Net 4.0. Je n'arrive pas à le faire fonctionner avec Visual Studio Dev IIS.

Mise à jour - En fait, j'ai essayé de supprimer ces paramètres de configuration et cela fonctionne toujours. Peut-être que .Net 4.0 a résolu ce problème par défaut.

0

Utilisez hex. Il y a un ConvertTo et un De et un exemple de test ...

Vous pouvez également scaper simplement les caractères qui ne correspondent pas de A à Z en utilisant une regex pour que votre URL soit toujours jolie.

Il renvoie une grande liste des numéros que vous devriez être bon

 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

Voici un Regex potentiel que vous pouvez utiliser pour accomplir le codage.

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

Je ne suis pas sûr qu'il ya une méthode de cadre existant défini pour coder strictement tous les caractères non alphanumériques que vous pouvez pointer vos clients à.

0

Si je ne me trompe pas, l'encodage d'URL est tout simplement le signe pour cent, suivi du numéro ASCII (en hexadécimal), donc cela devrait fonctionner ...

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 

Les résultats de code ci-dessus dans something%2Bme%40example.com

+0

Désolé que j'utilise VB.NET, mais vous pouvez facilement changer cela: http://codechanger.com/ –

+0

Comment décririez-vous cela? – Vyrotek

+0

@Vyrotek Vous pouvez vous fier à 'Uri.UnescapeDataString()' pour cela. –

Questions connexes