将"ä"编码为"%E4"

bal*_*dre 5 c# encoding

我正在尝试了解C#中满足新SMS提供程序要求的最佳编码.

我要发送的文字是:

BästeBjörn

提供商说它需要的编码文本是:

B%E4ste + BJ%F6rn

所以ä%E4ö%F6


从这个答案,我得到了,为了这样的转换,我需要使用HttpUtility.HtmlAttributeEncode正常HttpUtility.UrlEncode将输出:

B%C3%a4ste + BJ%C3%b6rn

并在手机上输出奇怪的字符:/

由于几个字符没有转换,我尝试了这个:

private string specialEncoding(string text)
{
    StringBuilder r = new StringBuilder();
    foreach (char c in text.ToCharArray())
    {
        string e = System.Web.HttpUtility.UrlEncode(c.ToString());
        if (e.StartsWith("%") && e.ToLower() != "%0a") // %0a == Linefeed
        {
            string attr = System.Web.HttpUtility.HtmlAttributeEncode(c.ToString());
            r.Append(attr);
        }
        else
        {
            r.Append(e);
        }

    }
    return r.ToString();
}
Run Code Online (Sandbox Code Playgroud)

详细,所以我可以断点并测试每个char,并发现:

System.Web.HttpUtility.HtmlAttributeEncode("ä")实际上等于ä...所以没有%E4输出...

我错过了什么?并且有一个简单的方法做编码,而不对它们进行处理成炭炭,并有所需的输出?

Cod*_*ter 5

提供商说它需要

询问提供者他们居住的年龄.根据维基百科:百分比编码:

通用URI语法要求在URI中提供字符数据表示的新URI方案实际上必须表示来自未保留集的字符而不进行转换,并且应该根据UTF-8所有其他字符转换为字节,然后百分比编码这些值.此要求于20051月随着RFC 3986的发布而引入.在此日期之前引入的URI方案不受影响.

当然,这个RFC谈到了"新的URI方案",而HTTP显然不是这样,但坚持这个标准可以防止像这样的头痛.另请参阅URL编码Unicode字符的正确方法是什么?.

他们似乎希望您根据Windows-1250代码页(或类似的,如ISO-8859-1或-2,在此检查备选方案)对字符进行编码,因为使用该代码页E4(132)映射到ä和F6( 148)映射到ö.正如@Simon在评论中指出的那样,您应该向提供商询问他们希望您使用哪个代码页.

假设Windows-1250,您可以按照URL编码ASCII/UTF16字符这样实现:

var windows1250 = Encoding.GetEncoding(1250);
var percentEncoded = HttpUtility.UrlEncode("Bäste Björn", windows1250);
Run Code Online (Sandbox Code Playgroud)

价值percentEncoded是:

B%e4ste + BJ%f6rn

如果他们坚持使用大写,请参阅.net UrlEncode - 小写问题.

  • 1250是"Windows-1250".事实上,它可能是"ISO-8859-2"(28592).这真的取决于这个"所谓的"短信提供商.只有他能说出他真正需要的东西...... (2认同)