![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TICQClient [D7, Win2k, WinXP]
IntruderLab © (2008-03-02 11:41:00)Изменил все строки в компоненте, которые отвечали за правильный коннект к серверу, теперь есть другая проблема-не видит русского языка и в принципе английского тоже:приходят сообщения в неправильной кодировке. Как решить проблему?
kolyann__ (2008-05-29 21:31:00) [1]А можно пападробней об перекодирование unicod'a в обычный string ? ?
han_malign (2008-05-29 16:31:00) [2]
> #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__ (2008-05-29 15:36:00) [3]Есть проблемка. Приходят корявые соабщения с инфума,
вот что в отладчике:
#0'!'#4'2'#4'E'#4'>'#4'4'#0'/'#0':'#0')'
Если это прогнать через UTF8ToStr(Msg) - то вылетит ошибка...
kolyann__ (2008-05-29 14:14:00) [4]благодарю
TForumHelp (2008-05-25 14:52:00) [5]Залезь в ICQWorks.pas, найди процедурку
procedure CreateCLI_SETUSERINFO(Pkt: PRawPkt;IsMTNEnabled : Boolean; XStatus: Byte; var Seq: Word);и убери строки:
CapPrefixes[11]+
CapPrefixes[12]+
GetNewCap(#$13#$4E)+
may be I am noob... (2008-05-24 17:10:00) [6]на
вставь в 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);
все робит ништяк.
Eraser (2008-05-24 03:11:00) [7]> [0] IntruderLab (02.03.08 11:41)
на сколько я знаю, там еще много чего переделывать прийдется, лучше оринетируйся на исходники миранды.
насчет кодировки - вроде они на юникод перешли.
kolyann__ (2008-05-24 00:44:00) [8]Сергей М., а как?? На некоторых форумах дают функции па удалению #0 байта (паидее там и #4 есть), но этого мало, можеш пападробнее...?
Сергей М. (2008-03-03 09:58:00) [9]
> Как решить проблему?
Перекодировать принятый текст в "правильную" кодировку.