我正在尝试了解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输出...
我错过了什么?并且有一个简单的方法做编码,而不对它们进行处理成炭炭,并有所需的输出?
提供商说它需要
询问提供者他们居住的年龄.根据维基百科:百分比编码:
通用URI语法要求在URI中提供字符数据表示的新URI方案实际上必须表示来自未保留集的字符而不进行转换,并且应该根据UTF-8将所有其他字符转换为字节,然后百分比编码这些值.此要求于2005年1月随着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 - 小写问题.
| 归档时间: |
|
| 查看次数: |
4511 次 |
| 最近记录: |