我想发送一个带有webclient的字符串,我遇到了德语变音问题。 用Fiddler检查,我看到post参数的以下转换是:
ä to %E4
(根据在线编码器工具,这是iso-8859-1)
你知道我怎么能为WP7做到这一点吗?
我已经尝试过了:
string urlstring = HttpUtility.UrlEncode("ä");
结果:%c3%a4
string urlstring1 = HttpUtility.HtmlEncode("ä");
结果:ä
Encoding isoenc = Encoding.GetEncoding("ISO-8859-1");
byte[] utf8characters = Encoding.UTF8.GetBytes("ä");
byte[] isoArray = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("ISO-8859-1"),utf8characters);
string finalString = isoenc.GetString(isoArray,0, isoArray.Length);
结果:ä
我还检查了这个silverlight工具,您可以在其中创建自定义编码..但没有成功。
我对此问题感到非常疯狂,如果有人有想法请告诉我。
谢谢, 拉尔夫
答案 0 :(得分:2)
nwellnhof提供的解决方案很好,但在Windows Phone上无法使用编码作为参数的HttpUtility.UrlEncode
重载。幸运的是,通过反编译框架程序集,可以很容易地修改它以使用您想要的编码:
public class HttpUtilityEx
{
public static string UrlEncode(string url, Encoding encoding)
{
if (url == null)
{
return null;
}
byte[] bytes = encoding.GetBytes(url);
int num = 0;
int num1 = 0;
int length = (int)bytes.Length;
for (int i = 0; i < length; i++)
{
char chr = (char)bytes[i];
if (chr == ' ')
{
num++;
}
else if (!IsSafe(chr))
{
num1++;
}
}
if ((num != 0 ? true : num1 != 0))
{
byte[] hex = new byte[length + num1 * 2];
int num2 = 0;
for (int j = 0; j < length; j++)
{
byte num3 = bytes[j];
char chr1 = (char)num3;
if (IsSafe(chr1))
{
int num4 = num2;
num2 = num4 + 1;
hex[num4] = num3;
}
else if (chr1 != ' ')
{
int num5 = num2;
num2 = num5 + 1;
hex[num5] = 37;
int num6 = num2;
num2 = num6 + 1;
hex[num6] = (byte)IntToHex(num3 >> 4 & 15);
int num7 = num2;
num2 = num7 + 1;
hex[num7] = (byte)IntToHex(num3 & 15);
}
else
{
int num8 = num2;
num2 = num8 + 1;
hex[num8] = 43;
}
}
bytes = hex;
}
return encoding.GetString(bytes, 0, (int)bytes.Length);
}
private static bool IsSafe(char ch)
{
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch >= '0' && ch <= '9')
{
return true;
}
char chr = ch;
if (chr != '!')
{
switch (chr)
{
case '\'':
case '(':
case ')':
case '*':
case '-':
case '.':
{
break;
}
case '+':
case ',':
{
return false;
}
default:
{
if (chr != '\u005F')
{
return false;
}
else
{
break;
}
}
}
}
return true;
}
internal static char IntToHex(int n)
{
if (n <= 9)
{
return (char)(n + 48);
}
return (char)(n - 10 + 97);
}
}
从那里,你只需要像HttpUtility那样调用它:
var result = HttpUtilityEx.UrlEncode("ä", Encoding.GetEncoding("ISO-8859-1"));
答案 1 :(得分:1)
HttpUtility.UrlEncode
有一个optional second parameter,用于指定编码。以下应该有效:
Encoding isoenc = Encoding.GetEncoding("ISO-8859-1");
String urlstring = HttpUtility.UrlEncode("ä", isoenc);