Url кодирование [c#]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by [х26]VОLАND, 6 Nov 2007.

  1. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Наверное многие сталкивались с проблемой URL-кодирования строки в C#. Стандартная C#-функция HttpUtility.UrlEncode() кодирует только спецсимволы и пробелы. Попытка кодирования путём преобразования char-кодов входных символов разбивала каждый символ кириллицы на два url-представления (напр. %d9%c0). Дело в том что в C# char-код получается путём UTF8 кодирования. В результате на выходе мы получаем вполне рабочую URL-строку, но она не совместима с другими url-декодерами.
    Написанные мной процедуры для кодирования/декодирования исправляют эту проблему, и получается стандартная url-строка, совместимая с другими декодерами.
    Функция кодирвания:
    PHP:
    public string UrlEncode(string s)
    {
        
    char[] chars = new char[256];
        
    chars[128] = 'Ђ';
        
    chars[129] = 'Ѓ';
        
    chars[130] = '‚';
        
    chars[131] = 'ѓ';
        
    chars[132] = '„';
        
    chars[133] = '…';
        
    chars[134] = '†';
        
    chars[135] = '‡';
        
    chars[136] = '?';
        
    chars[137] = '‰';
        
    chars[138] = 'Љ';
        
    chars[139] = '‹';
        
    chars[140] = 'Њ';
        
    chars[141] = 'Ќ';
        
    chars[142] = 'Ћ';
        
    chars[143] = 'Џ';
        
    chars[144] = 'ђ';
        
    chars[145] = '‘';
        
    chars[146] = '’';
        
    chars[147] = '“';
        
    chars[148] = '”';
        
    chars[149] = '•';
        
    chars[150] = '–';
        
    chars[151] = '—';
        
    chars[152] = '˜';
        
    chars[153] = '™';
        
    chars[154] = 'љ';
        
    chars[155] = '›';
        
    chars[156] = 'њ';
        
    chars[157] = 'ќ';
        
    chars[158] = 'ћ';
        
    chars[159] = 'џ';
        
    chars[160] = '*';
        
    chars[161] = 'Ў';
        
    chars[162] = 'ў';
        
    chars[163] = 'Ј';
        
    chars[164] = '¤';
        
    chars[165] = 'Ґ';
        
    chars[166] = '¦';
        
    chars[167] = '§';
        
    chars[168] = 'Ё';
        
    chars[169] = '©';
        
    chars[170] = 'Є';
        
    chars[171] = '«';
        
    chars[172] = '¬';
        
    chars[173] = '*';
        
    chars[174] = '®';
        
    chars[175] = 'Ї';
        
    chars[176] = '°';
        
    chars[177] = '±';
        
    chars[178] = 'І';
        
    chars[179] = 'і';
        
    chars[180] = 'ґ';
        
    chars[181] = 'µ';
        
    chars[182] = '¶';
        
    chars[183] = '·';
        
    chars[184] = 'ё';
        
    chars[185] = '№';
        
    chars[186] = 'є';
        
    chars[187] = '»';
        
    chars[188] = 'ј';
        
    chars[189] = 'Ѕ';
        
    chars[190] = 'ѕ';
        
    chars[191] = 'ї';
        
    chars[192] = 'А';
        
    chars[193] = 'Б';
        
    chars[194] = 'В';
        
    chars[195] = 'Г';
        
    chars[196] = 'Д';
        
    chars[197] = 'Е';
        
    chars[198] = 'Ж';
        
    chars[199] = 'З';
        
    chars[200] = 'И';
        
    chars[201] = 'Й';
        
    chars[202] = 'К';
        
    chars[203] = 'Л';
        
    chars[204] = 'М';
        
    chars[205] = 'Н';
        
    chars[206] = 'О';
        
    chars[207] = 'П';
        
    chars[208] = 'Р';
        
    chars[209] = 'С';
        
    chars[210] = 'Т';
        
    chars[211] = 'У';
        
    chars[212] = 'Ф';
        
    chars[213] = 'Х';
        
    chars[214] = 'Ц';
        
    chars[215] = 'Ч';
        
    chars[216] = 'Ш';
        
    chars[217] = 'Щ';
        
    chars[218] = 'Ъ';
        
    chars[219] = 'Ы';
        
    chars[220] = 'Ь';
        
    chars[221] = 'Э';
        
    chars[222] = 'Ю';
        
    chars[223] = 'Я';
        
    chars[224] = 'а';
        
    chars[225] = 'б';
        
    chars[226] = 'в';
        
    chars[227] = 'г';
        
    chars[228] = 'д';
        
    chars[229] = 'е';
        
    chars[230] = 'ж';
        
    chars[231] = 'з';
        
    chars[232] = 'и';
        
    chars[233] = 'й';
        
    chars[234] = 'к';
        
    chars[235] = 'л';
        
    chars[236] = 'м';
        
    chars[237] = 'н';
        
    chars[238] = 'о';
        
    chars[239] = 'п';
        
    chars[240] = 'р';
        
    chars[241] = 'с';
        
    chars[242] = 'т';
        
    chars[243] = 'у';
        
    chars[244] = 'ф';
        
    chars[245] = 'х';
        
    chars[246] = 'ц';
        
    chars[247] = 'ч';
        
    chars[248] = 'ш';
        
    chars[249] = 'щ';
        
    chars[250] = 'ъ';
        
    chars[251] = 'ы';
        
    chars[252] = 'ь';
        
    chars[253] = 'э';
        
    chars[254] = 'ю';
        
    chars[255] = 'я';

        
    char[] bytes s.ToCharArray();
        
    string outstr "";
        
    int chr;
        for (
    int i 0bytes.Lengthi++)
        {
            if ((int)
    s[i] > 128)
            {
                
    chr = Array.IndexOf(chars,s[i]);
            }
            else
            {
                
    chr = (int)bytes[i];
            }

            
    outstr += "%" Convert.ToString(chr16);
        }
        return 
    outstr.ToLower();
            }
    Дункция декодирования:
    PHP:
    public string UrlDecode(string s)
    {
        
    char[] chars = new char[256];
        
    chars[128] = 'Ђ';
        
    chars[129] = 'Ѓ';
        
    chars[130] = '‚';
        
    chars[131] = 'ѓ';
        
    chars[132] = '„';
        
    chars[133] = '…';
        
    chars[134] = '†';
        
    chars[135] = '‡';
        
    chars[136] = '?';
        
    chars[137] = '‰';
        
    chars[138] = 'Љ';
        
    chars[139] = '‹';
        
    chars[140] = 'Њ';
        
    chars[141] = 'Ќ';
        
    chars[142] = 'Ћ';
        
    chars[143] = 'Џ';
        
    chars[144] = 'ђ';
        
    chars[145] = '‘';
        
    chars[146] = '’';
        
    chars[147] = '“';
        
    chars[148] = '”';
        
    chars[149] = '•';
        
    chars[150] = '–';
        
    chars[151] = '—';
        
    chars[152] = '˜';
        
    chars[153] = '™';
        
    chars[154] = 'љ';
        
    chars[155] = '›';
        
    chars[156] = 'њ';
        
    chars[157] = 'ќ';
        
    chars[158] = 'ћ';
        
    chars[159] = 'џ';
        
    chars[160] = '*';
        
    chars[161] = 'Ў';
        
    chars[162] = 'ў';
        
    chars[163] = 'Ј';
        
    chars[164] = '¤';
        
    chars[165] = 'Ґ';
        
    chars[166] = '¦';
        
    chars[167] = '§';
        
    chars[168] = 'Ё';
        
    chars[169] = '©';
        
    chars[170] = 'Є';
        
    chars[171] = '«';
        
    chars[172] = '¬';
        
    chars[173] = '*';
        
    chars[174] = '®';
        
    chars[175] = 'Ї';
        
    chars[176] = '°';
        
    chars[177] = '±';
        
    chars[178] = 'І';
        
    chars[179] = 'і';
        
    chars[180] = 'ґ';
        
    chars[181] = 'µ';
        
    chars[182] = '¶';
        
    chars[183] = '·';
        
    chars[184] = 'ё';
        
    chars[185] = '№';
        
    chars[186] = 'є';
        
    chars[187] = '»';
        
    chars[188] = 'ј';
        
    chars[189] = 'Ѕ';
        
    chars[190] = 'ѕ';
        
    chars[191] = 'ї';
        
    chars[192] = 'А';
        
    chars[193] = 'Б';
        
    chars[194] = 'В';
        
    chars[195] = 'Г';
        
    chars[196] = 'Д';
        
    chars[197] = 'Е';
        
    chars[198] = 'Ж';
        
    chars[199] = 'З';
        
    chars[200] = 'И';
        
    chars[201] = 'Й';
        
    chars[202] = 'К';
        
    chars[203] = 'Л';
        
    chars[204] = 'М';
        
    chars[205] = 'Н';
        
    chars[206] = 'О';
        
    chars[207] = 'П';
        
    chars[208] = 'Р';
        
    chars[209] = 'С';
        
    chars[210] = 'Т';
        
    chars[211] = 'У';
        
    chars[212] = 'Ф';
        
    chars[213] = 'Х';
        
    chars[214] = 'Ц';
        
    chars[215] = 'Ч';
        
    chars[216] = 'Ш';
        
    chars[217] = 'Щ';
        
    chars[218] = 'Ъ';
        
    chars[219] = 'Ы';
        
    chars[220] = 'Ь';
        
    chars[221] = 'Э';
        
    chars[222] = 'Ю';
        
    chars[223] = 'Я';
        
    chars[224] = 'а';
        
    chars[225] = 'б';
        
    chars[226] = 'в';
        
    chars[227] = 'г';
        
    chars[228] = 'д';
        
    chars[229] = 'е';
        
    chars[230] = 'ж';
        
    chars[231] = 'з';
        
    chars[232] = 'и';
        
    chars[233] = 'й';
        
    chars[234] = 'к';
        
    chars[235] = 'л';
        
    chars[236] = 'м';
        
    chars[237] = 'н';
        
    chars[238] = 'о';
        
    chars[239] = 'п';
        
    chars[240] = 'р';
        
    chars[241] = 'с';
        
    chars[242] = 'т';
        
    chars[243] = 'у';
        
    chars[244] = 'ф';
        
    chars[245] = 'х';
        
    chars[246] = 'ц';
        
    chars[247] = 'ч';
        
    chars[248] = 'ш';
        
    chars[249] = 'щ';
        
    chars[250] = 'ъ';
        
    chars[251] = 'ы';
        
    chars[252] = 'ь';
        
    chars[253] = 'э';
        
    chars[254] = 'ю';
        
    chars[255] = 'я';

        
    float d s.Length 3;
        
    int max Convert.ToInt32(Math.Floor(d));
        
    string outstr "";
        
    char chr;
        
    int index;
        for (
    int i 0maxi++)
        {
            try
            {
                
    index 0;
                
    chr Uri.HexUnescape(s.Substring(33), ref index);
                if ((int)
    chr 128 && (int)chr 255)
                {
            
    outstr += chars[chr];
                }
                else
                {
            
    outstr += chr;
                }
            }catch (
    Exception e){} // <-- для игнора всех ошибок
        
    }

        return 
    outstr;
    }
     
    4 people like this.