URL编码C#中的所有非字母数字

时间:2010-06-18 19:06:10

标签: c# .net wcf urlencode

我需要完全URL编码电子邮件地址。

HttpUtility.UrlEncode似乎忽略了某些字符,比如!和。

我需要在这样的网址中传递一个电子邮件地址:

/Users/me@example.com/Comments

因为我的WebMethod uri模板如下所示:

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

句点会中断WCF,并且不会将电子邮件地址传递给我的REST Web服务方法。 删除期间传递的值就好了。我希望有一种方法可以编码所有非字母数字字符,因为使用此服务的所有内容都需要这样做。

修改

我考虑过使用:

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

大多数其他语言是否有简单的方法将字符串转换为base64?我主要担心的是,使用此服务的客户需要使用Java,PHP,Ruby等对电子邮件地址进行编码。

4 个答案:

答案 0 :(得分:2)

这是一个可以用来完成编码的潜在正则表达式。

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

我不确定是否存在一个现有的框架方法来严格编码您可以指向客户的所有非字母数字字符。

答案 1 :(得分:0)

使用十六进制。有一个ConvertTo和一个From和一个样本测试...

您还可以使用正则表达式来查看与A到Z不匹配的字符,这样您的网址看起来仍然很漂亮。

它会返回一个很大的数字列表,所以你应该很好

        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();

    }

答案 2 :(得分:0)

除非我弄错了,否则URL编码只是百分号,后跟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

答案 3 :(得分:0)

我发现了这个问题的解决方案。

.Net 4.0实际上已经解决了URI模板中特殊字符的问题。

这个帖子指出了我正确的方向。 http://social.msdn.microsoft.com/Forums/en/dataservices/thread/b5a14fc9-3975-4a7f-bdaa-b97b8f26212b

我添加了所有配置设置,但它确实有效。但请注意,它仅适用于带有.Net 4.0的REAL IIS设置。我似乎无法使用Visual Studio Dev IIS。

更新 - 实际上,我尝试删除这些配置设置,它仍然有效。可能是.Net 4.0默认修复了这个问题。