Функция URLEnode [C#]

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

  1. [х26]VОLАND

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

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Нужен исходник функции URLEncode для C#.
    Юзать стандартный метод httpUtility.Urlencode(string) не хочу, так как он странно работает:
    К примеру, буква "д" в нормальной урл-кодировке выглядит как %E4, а через httpUtility.Urlencode(string) получается %d0%b4 :(

    Скорее всего дело в различном способе парсинга символов в char-коды. Букве "д" соответствует код 228, а вот в httpUtility.Urlencode(string) буква "д" имеет код 388, и поэтому раскладывает код на два числа:
    388 = %d0 + %b4 (т.е. 388 = 208 + 180),
    Нужно чтобы символы кодировались нормально, без разложения.

    Уже весь инет перерыл, ничего путного не нашёл.
     
    #1 [х26]VОLАND, 12 Oct 2007
    Last edited: 13 Oct 2007
  2. inv

    inv Banned

    Joined:
    3 Aug 2007
    Messages:
    261
    Likes Received:
    143
    Reputations:
    -58
    http://binboy.sphere.pl/index.php?show=usenet&p1=article.php&id=3179&group=pl.comp.lang.c (для си)


    самому не судьба что ли?
     
  3. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Вот так загнул ну ты даешь! %d0%b4 это просто UTF8 представление буквы.
    Если интересно вот алгоритм на php как составляется UTF8 из cp1251
    Code:
    function CP1251toUTF8($string){
    	$out = '';
    	for ($i = 0; $i<strlen($string); ++$i){
    		$ch = ord($string{$i});
    		if ($ch < 0x80)
    			$out .= chr($ch);
    		else
    			if($ch >= 0xC0)
    				if($ch < 0xF0)
    					$out .= "\xD0".chr(0x90 + $ch - 0xC0);
    				else
    					$out .= "\xD1".chr(0x80 + $ch - 0xF0);
    			else
    			switch($ch){
    				case 0xA8: $out .= "\xD0\x81"; break;
    				case 0xB8: $out .= "\xD1\x91"; break;
    			   	case 0xA1: $out .= "\xD0\x8E"; break;
    				case 0xA2: $out .= "\xD1\x9E"; break;
    				case 0xAA: $out .= "\xD0\x84"; break;
    				case 0xAF: $out .= "\xD0\x87"; break;
    				case 0xB2: $out .= "\xD0\x86"; break;
    				case 0xB3: $out .= "\xD1\x96"; break;
    				case 0xBA: $out .= "\xD1\x94"; break;
    				case 0xBF: $out .= "\xD1\x97"; break;
    				case 0x8C: $out .= "\xD3\x90"; break;
    				case 0x8D: $out .= "\xD3\x96"; break;
    				case 0x8E: $out .= "\xD2\xAA"; break;
    				case 0x8F: $out .= "\xD3\xB2"; break;
    				case 0x9C: $out .= "\xD3\x91"; break;
    				case 0x9D: $out .= "\xD3\x97"; break;
    				case 0x9E: $out .= "\xD2\xAB"; break;
    				case 0x9F: $out .= "\xD3\xB3"; break;
    			}
    	}
    	return $out;
    }
    
     
    2 people like this.
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    msdn

    HttpUtility.UrlEncode (String, Encoding) Encodes a URL string using the specified encoding object.

    это не подходит?