繁体   English   中英

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

[英]URL Encode all non alpha numeric in C#

我需要完全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等对电子邮件地址进行编码。

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

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

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

使用十六进制 有一个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();

    }

除非我弄错了,否则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

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

.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默认修复了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM