-
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)
на сколько я знаю, там еще много чего переделывать прийдется, лучше оринетируйся на исходники миранды.
насчет кодировки - вроде они на юникод перешли. -
на
вставь в ICQWorksfunction 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) - то вылетит ошибка... -
> #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 ? ?