Конференция "Сети" » TICQClient [D7, Win2k, WinXP]
 
  • IntruderLab (02.03.08 11:41) [0]
    Изменил все строки в компоненте, которые отвечали за правильный коннект к серверу, теперь есть другая проблема-не видит русского языка и в принципе английского тоже:приходят сообщения в неправильной кодировке. Как решить проблему?
  • Сергей М. © (03.03.08 09:58) [1]

    > Как решить проблему?


    Перекодировать принятый текст в "правильную" кодировку.
  • kolyann__ (24.05.08 00:44) [2]
    Сергей М., а как?? На некоторых форумах дают функции па удалению #0 байта (паидее там и #4 есть), но этого мало, можеш пападробнее...?
  • Eraser © (24.05.08 03:11) [3]
    > [0] IntruderLab   (02.03.08 11:41)

    на сколько я знаю, там еще много чего переделывать прийдется, лучше оринетируйся на исходники миранды.
    насчет кодировки - вроде они на юникод перешли.
  • may be I am noob... © (24.05.08 17:10) [4]
    на

    вставь в ICQWorks

    function UTF8ToStr(Value: String): String;
    function UTF8ToStrSmart(Value: String): String;

    function UTF8ToStr(Value: String): String;
    var
     buffer: Pointer;
     BufLen: LongWord;
    begin
     BufLen := Length(Value) + 4;
     GetMem(buffer, BufLen);
     FillChar(buffer^, BufLen, 0);
     MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen);
     Result := WideCharToString(buffer);
     FreeMem(buffer, BufLen);
    end;

    function UTF8ToStrSmart(Value: String): String;
    var
     Digit: String;
     i: Word;
     HByte: Byte;
     Len: Byte;
    begin
     Result := '';
     Len := 0;
     if Value = '' then Exit;
     for i := 1 to Length(Value) do
     begin
       if Len > 0 then
       begin
         Digit := Digit + Value[i];
         Dec(Len);
         if Len = 0 then
           Result := Result + UTF8ToStr(Digit);
       end else
       begin
         HByte := Ord(Value[i]);
         if HByte in [$00..$7f] then       //Standart ASCII chars
           Result := Result + Value[i]
         else begin
           //Get length of UTF-8 char
           if HByte and $FC = $FC then
             Len := 6
           else if HByte and $F8 = $F8 then
             Len := 5
           else if HByte and $F0 = $F0 then
             Len := 4
           else if HByte and $E0 = $E0 then
             Len := 3
           else if HByte and $C0 = $C0 then
             Len := 2
           else begin
             Result := Result + Value[i];
             Continue;
           end;
           Dec(Len);
           Digit := Value[i];
         end;
       end;
     end;
    end;



    затем идешь в ICQClient
    ищешь:
    if Assigned(OnMessageRecv) then
     FOnMsg(Self, Msg, UIN);



    заменяешь на:
    if Assigned(OnMessageRecv) then
     FOnMsg(Self, UTF8ToStr(Msg), UIN);



    все робит ништяк.
  • TForumHelp © (25.05.08 14:52) [5]
    Залезь в ICQWorks.pas, найди процедурку
    procedure CreateCLI_SETUSERINFO(Pkt: PRawPkt;IsMTNEnabled : Boolean; XStatus: Byte; var Seq: Word);

    и убери строки:


    CapPrefixes[11]+
    CapPrefixes[12]+
    GetNewCap(#$13#$4E)+

  • kolyann__ (29.05.08 14:14) [6]
    благодарю
  • kolyann__ (29.05.08 15:36) [7]
    Есть проблемка. Приходят корявые соабщения с инфума,
    вот что в отладчике:
    #0'!'#4'2'#4'E'#4'>'#4'4'#0'/'#0':'#0')'
    Если это прогнать через UTF8ToStr(Msg)  - то вылетит ошибка...
  • han_malign © (29.05.08 16:31) [8]

    > #0'!'#4'2'#4'E'#4'>'#4'4'#0'/'#0':'#0')'

    енто - UCS16(#4 - как раз русская страница), в простонорадье Unicode,
    если сначала четные с нечетными байты местами поменять - то приведенеие к WideChar прокатит...

    З.Ы. вообще то в заголовке пакета кодировка указывается...
    1-й канал данных
         TLV(2)
                 TLV($101)
                       Encoding: Word
                       CodePage: Word
                       data...
    (Encoding = 2) - Unicode
  • kolyann__ (29.05.08 21:31) [9]
    А можно пападробней об перекодирование unicod'a в обычный string ? ?
 
Конференция "Сети" » TICQClient [D7, Win2k, WinXP]
Есть новые Нет новых   [134433   +21][b:0][p:0.002]