2013-09-13 2 views
1

Я хочу отправить строку с веб-клиентом, и у меня проблемы с немецким umlaute. Проверка с помощью Fiddler, я вижу, что следующее преобразование для параметра пост состоит из:String Encoding Umlaute

ä to %E4 (который изо-8859-1 в соответствии с онлайн-инструмент энкодера)

Вы знаете, как я могу achive это для 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 инструмент, где вы можете создавать собственные кодировки .. без успеха.

Я действительно схожу с ума по этой проблеме, если у кого есть идея, пожалуйста, дайте мне знать.

Спасибо, Ralf

+0

Это интересный вопрос. Вы можете получить E4, выполнив: «Encoding.GetEncoding (« iso-8859-1 »). GetBytes (« ä ») [0] .ToString (« X »)' Оттуда, возможно, вы создадите собственный кодировщик строк, который проверяет байт больше 127 и заменяет их своим кодированным значением? Кроме того, действительно ли нужно отправить '% E4'? Возможно, проблема заключается в том, что значение, которое вы отправляете на сервер, не кодируется в iso-8859-1, начиная с –

+0

, поэтому я снова проверил без кодирования: я отправляю строку, вкл. Запрос «ä» будет отклонен, я отправлю строку вкл. «% E4» он запускается с сервера и показывает «ä». – c0ldsun

+0

, поэтому я снова проверил без кодировки: я отправляю строку вкл. Запрос «ä» будет отклонен; я отправляю строку вкл. «% E4» принимается с сервера и отображает «ä», когда отправляется «% c3% a4» (стандартный HttpUtility.Encoding), он показывает «Ã» »(кстати, я также пытался использовать webclient.encoding iso-8859- 1, но это не сработает, потому что строка имеет несколько параметров (с =), webclient.кодирование utf8 прекрасно, и также показано в Fiddler, когда я делаю сообщение через веб-страницу). Но метод, который вы упомянули, является интересным подходом, я буду исследовать это. Thx :-) – c0ldsun

ответ

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")); 
+0

Именно то, что я ищу. Ты спас свой день. Большое спасибо :-) ... и теперь я разместил ваш блог в блоге. – c0ldsun

1

HttpUtility.UrlEncode имеет optional second parameter, который определяет кодировку. Следующие должны работать:

Encoding isoenc = Encoding.GetEncoding("ISO-8859-1"); 
String urlstring = HttpUtility.UrlEncode("ä", isoenc); 
+0

К сожалению, эта перегрузка недоступна на Windows Phone –