1

Web クライアントで文字列を送信したいのですが、ドイツ語のウムラウトに問題があります。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ツールもチェックしました..成功しませんでした。

私はこの問題について本当に夢中になっています。誰かがアイデアを持っているなら、私に知らせてください。

ありがとう、ラルフ

4

2 に答える 2

2

nwellnhof が提供するソリューションは優れHttpUtility.UrlEncodeていますが、エンコーディングをパラメーターとして受け取るオーバーロードは、Windows Phone では利用できません。幸いなことに、フレームワーク アセンブリを逆コンパイルすることで、必要なエンコーディングを使用するように簡単に変更できます。

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"));
于 2013-09-13T23:04:08.373 に答える
1

HttpUtility.UrlEncodeエンコーディングを指定するオプションの 2 番目のパラメーターがあります。以下が機能するはずです。

Encoding isoenc = Encoding.GetEncoding("ISO-8859-1");
String urlstring = HttpUtility.UrlEncode("ä", isoenc);
于 2013-09-13T20:35:16.160 に答える