Смена кодировок в Дельфи

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by -Seet-, 25 Jul 2010.

  1. -Seet-

    -Seet- Banned

    Joined:
    24 May 2010
    Messages:
    0
    Likes Received:
    7
    Reputations:
    0
    доброе время суток ачатовцам ;)

    у меня возникла одна проблемка с кодировками в дельфи. поснифил одну программку, она отсылала post с параметрами в непонятной кодировке

    Расшифровалось без проблем, но дело не в этом. Дело в том ,что мне нужно написать аналог этой программы. И нужно обычный ANSI текст перекодировать в эту же крокозябру. Желательно с помощью дельфи.
     
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    На делфи нет, на билдере как-то так:
    PHP:
    //---------------------------------------------------------------------------
    String MultibyteToUTF8(String sSource)
    {
        
    WideString wsStr sSource;
        
    String sTarget;
        
    char *pTargetData NULL;
        
    int iTargetLen WideCharToMultiByte(CP_UTF8,
                                            
    0,
                                            
    wsStr,
                                            -
    1,
                                            
    pTargetData,
                                            
    0,
                                            
    NULL,
                                            
    NULL);

        
    pTargetData = new char[iTargetLen 1];
        
    memset(pTargetData0iTargetLen 1);
        
    WideCharToMultiByte(CP_UTF8,
                            
    0,
                            
    wsStr,
                            -
    1,
                            
    pTargetData,
                            
    iTargetLen,
                            
    NULL,
                            
    NULL);
        
    char *data pTargetData;
        
    sTarget data;
        
    delete []pTargetData;
        
    pTargetData NULL;
        return 
    sTarget;
    }
    //---------------------------------------------------------------------------
     
  3. -Seet-

    -Seet- Banned

    Joined:
    24 May 2010
    Messages:
    0
    Likes Received:
    7
    Reputations:
    0
    спасибо за попытку помочь, но для меня билдер - темный лес)
    дельфи знаю неплохо, но вот с кодировками никогда не работал. в Рунете ответа я не нашел, а в буржунет лезть не очень то хочется)
     
  4. 0xF0RD

    0xF0RD Member

    Joined:
    2 Dec 2009
    Messages:
    49
    Likes Received:
    6
    Reputations:
    0
    Эти подойдут?
    Code:
    function EncodeBase64(const inStr: string): string;
      function Encode_Byte(b: Byte): char;
      const
        Base64Code: string[64] =
          'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
      begin
        Result := Base64Code[(b and $3F)+1];
      end;
    var
      i: Integer;
    begin
      i := 1;
      Result := '';
      while i <=Length(InStr) do
      begin
        Result := Result + Encode_Byte(Byte(inStr[i]) shr 2);
        Result := Result + Encode_Byte((Byte(inStr[i]) shl 4) or (Byte(inStr[i+1]) shr 4));
        if i+1 <=Length(inStr) then
          Result := Result + Encode_Byte((Byte(inStr[i+1]) shl 2) or (Byte(inStr[i+2]) shr 6))
        else
          Result := Result + '=';
        if i+2 <=Length(inStr) then
          Result := Result + Encode_Byte(Byte(inStr[i+2]))
        else
          Result := Result + '=';
        Inc(i, 3);
      end;
    end;
    
    Code:
    function DecodeBase64(const CinLine: string): string;
    const
      RESULT_ERROR = -2;
    var
      inLineIndex: Integer;
      c: Char;
      x: SmallInt;
      c4: Word;
      StoredC4: array[0..3] of SmallInt;
      InLineLength: Integer;
    begin
      Result := '';
      inLineIndex := 1;
      c4 := 0;
      InLineLength := Length(CinLine);
      while inLineIndex <=InLineLength do
      begin
        while (inLineIndex <=InLineLength) and (c4 < 4) do
        begin
          c := CinLine[inLineIndex];
          case c of
            '+'     : x := 62;
            '/'     : x := 63;
            '0'..'9': x := Ord(c) - (Ord('0')-52);
            '='     : x := -1;
            'A'..'Z': x := Ord(c) - Ord('A');
            'a'..'z': x := Ord(c) - (Ord('a')-26);
          else
            x := RESULT_ERROR;
          end;
          if x <> RESULT_ERROR then
          begin
            StoredC4[c4] := x;
            Inc(c4);
          end;
          Inc(inLineIndex);
        end;
        if c4 = 4 then
        begin
          c4 := 0;
          Result := Result + Char((StoredC4[0] shl 2) or (StoredC4[1] shr 4));
          if StoredC4[2] = -1 then Exit;
          Result := Result + Char((StoredC4[1] shl 4) or (StoredC4[2] shr 2));
          if StoredC4[3] = -1 then Exit;
          Result := Result + Char((StoredC4[2] shl 6) or (StoredC4[3]));
        end;
      end;
    end;
    
     
  5. xmadstyle

    xmadstyle Member

    Joined:
    29 Aug 2008
    Messages:
    91
    Likes Received:
    53
    Reputations:
    24
    На дельфи есть:

    UTF8Encode();
    UTF8Decode();