[x26]VOLAND
06.11.2007, 11:17
Наверное многие сталкивались с проблемой URL-кодирования строки в C#. Стандартная C#-функция HttpUtility.UrlEncode() кодирует только спецсимволы и пробелы. Попытка кодирования путём преобразования char-кодов входных символов разбивала каждый символ кириллицы на два url-представления (напр. %d9%c0). Дело в том что в C# char-код получается путём UTF8 кодирования. В результате на выходе мы получаем вполне рабочую URL-строку, но она не совместима с другими url-декодерами.
Написанные мной процедуры для кодирования/декодирования исправляют эту проблему, и получается стандартная url-строка, совместимая с другими декодерами.
Функция кодирвания:
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 = 0; i < bytes.Length; i++)
{
if ((int)s[i] > 128)
{
chr = Array.IndexOf(chars,s[i]);
}
else
{
chr = (int)bytes[i];
}
outstr += "%" + Convert.ToString(chr, 16);
}
return outstr.ToLower();
}
Дункция декодирования:
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 = 0; i < max; i++)
{
try
{
index = 0;
chr = Uri.HexUnescape(s.Substring(i * 3, 3), ref index);
if ((int)chr > 128 && (int)chr < 255)
{
outstr += chars[chr];
}
else
{
outstr += chr;
}
}catch (Exception e){} // <-- для игнора всех ошибок
}
return outstr;
}
Написанные мной процедуры для кодирования/декодирования исправляют эту проблему, и получается стандартная url-строка, совместимая с другими декодерами.
Функция кодирвания:
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 = 0; i < bytes.Length; i++)
{
if ((int)s[i] > 128)
{
chr = Array.IndexOf(chars,s[i]);
}
else
{
chr = (int)bytes[i];
}
outstr += "%" + Convert.ToString(chr, 16);
}
return outstr.ToLower();
}
Дункция декодирования:
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 = 0; i < max; i++)
{
try
{
index = 0;
chr = Uri.HexUnescape(s.Substring(i * 3, 3), ref index);
if ((int)chr > 128 && (int)chr < 255)
{
outstr += chars[chr];
}
else
{
outstr += chr;
}
}catch (Exception e){} // <-- для игнора всех ошибок
}
return outstr;
}