URL Кодировать все не буквенно-цифровые в C # - PullRequest
7 голосов
/ 18 июня 2010

Мне нужно полностью URL. Кодировать адрес электронной почты.

HttpUtility.UrlEncode, похоже, игнорирует определенные символы, такие как!и.

Мне нужно передать адрес электронной почты в URL, сформатированном так:

/Users/me@example.com/Comments

Поскольку мой шаблон Uri WebMethod выглядит следующим образом:

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

точка перерывает WCF и не передает адрес электронной почты моему методу веб-сервиса REST.Удаление периода передает значение просто отлично.Я надеюсь, что есть метод, который будет кодировать все не алфавитно-цифровые символы, так как все, что потребляет этот сервис, должны будут сделать это.

EDIT

Я рассмотрел использование:

Convert.ToBase64String(Encoding.ASCII.GetBytes("something+me@example.com"))

Есть ли в большинстве других языков простые способы преобразования строки в base64?Моя главная проблема заключается в том, что нашим клиентам, использующим эту услугу, потребуется кодировать адрес электронной почты, используя Java, PHP, Ruby и т. Д.

Ответы [ 4 ]

2 голосов
/ 18 июня 2010

Вот потенциальное регулярное выражение, которое вы могли бы использовать для выполнения кодирования.

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

Я не уверен, что существует существующий метод структуры, определенный для строгого кодирования всех не алфавитно-цифровыхсимволы, на которых вы могли бы указать своих клиентов.

0 голосов
/ 19 июня 2010

Я нашел решение этой проблемы.

.Net 4.0 фактически исправил проблему со специальными символами в шаблоне URI.

Этот поток указал мне правильное направление.http://social.msdn.microsoft.com/Forums/en/dataservices/thread/b5a14fc9-3975-4a7f-bdaa-b97b8f26212b

Я добавил все настройки конфига, и все заработало.Но обратите внимание, он работает ТОЛЬКО с НАСТОЯЩЕЙ настройкой IIS с .Net 4.0.Кажется, я не могу заставить его работать с Visual Studio Dev IIS.

Обновление - На самом деле я попытался удалить эти параметры конфигурации, и он все еще работает.Возможно, в .Net 4.0 эта проблема исправлена ​​по умолчанию.

0 голосов
/ 18 июня 2010

Если я не ошибаюсь, URL Encoding - это просто знак процента, за которым следует номер ASCII (в шестнадцатеричном формате), поэтому это должно работать ...

Dim Encoded as New StringBuilder()

For Each Ch as Char In "something+me@example.com"
    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

Приведенный выше код приводит к something%2Bme%40example.com

0 голосов
/ 18 июня 2010

Используйте гекс.Существует ConvertTo, From и образец теста ...

Вы также можете просто отбрасывать символы, которые не соответствуют от A до Z, используя регулярное выражение, чтобы ваш URL все еще выглядел симпатично.

Он вернет большой список чисел, поэтому вы должны быть хорошими

        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("don.joe@gmail.com");
        Console.WriteLine(hex);
        Console.ReadLine();
        string stringValue =
        ConvertToString(hex);
        Console.WriteLine(stringValue);
        Console.ReadLine();

    }
...