Показать сообщение отдельно
Старый 28.05.2012, 17:26   #14
LIDERSERVIS
Оператор ЭВМ
 
Регистрация: 20.10.2009
Сообщений: 49
Написано 2 полезных сообщений
(для 3 пользователей)
Ответ: Lib_binsock: прием/отправка бинарных данных через сокет

Сообщение от AssA Посмотреть сообщение
провел тест на LG ( gw300 ):

binsock.debug_register(0);
binsock.enable_debug(-1);

ansi:
отправил: 123фф123
на тел:123? ( len = 4 )
utf-8:
отправил: 123фф123
на тел: 123фф123 ( len = 8 )

......

то есть засада в функции binsock.read_bin() - мне кажется, когда присваивается результат, NOKIA и LG воспринимают это по-разному: нокиа строго раскладывает побайтно, lg в этом потоке бинарных данных рассматривает utf8 символы и преобразует находу. можно ли и NOKIA заставить "распознавать" строку UTF-8 ?

1. На Delphi :
Перевожу русские буквы в base64, и отправляю в сокет ...Socket.Connections[i].SendText(AnsiToBase64('ваш текст' + '@')),
где например @ --- дополнительно обозначаю конец текста

function AnsiToBase64(S : String):String;
var
        
SS : string;
begin
        SS
:=Utf8Encode(S);
        
SS:=EncodeBase64(SS);
        
result:=SS;
end; 
где, Utf8Encode --- стандартная ф-ция библиотеки System

EncodeBase64 :
function EncodeBase64(Value: String): String;
const 
 
b64alphabet: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 
  
pad: PChar = '===='; 

  function 
EncodeChunk(const Chunk: String): String; 
  var 
    
W: LongWord; 
    
i, n: Byte; 
  
begin 
    n 
:= Length(Chunk); W := 0; 
    for 
i := 0 to n - 1 do 
      
W := W + Ord(Chunk[i + 1]) shl ((2 - i) * 8); 
    
Result := b64alphabet[(W shr 18) and $3f] + 
              
b64alphabet[(W shr 12) and $3f] + 
              
b64alphabet[(W shr 06) and $3f] + 
              
b64alphabet[(W shr 00) and $3f]; 
    if 
n <> 3 then 
      Result 
:= Copy(Result, 0, n + 1) + Copy(pad, 0, 3 - n); 
  
end; 

begin 
  Result 
:= ''; 
  while 
Length(Value) > 0 do 
  
begin 
    Result 
:= Result + EncodeChunk(Copy(Value, 0, 3)); 
    
Delete(Value, 1, 3); 
  
end; 
end; 
********************************************

2. На мобильном клиенте
Считываю данные,

Function ReadData():string;
var
        
k, i : integer;
        
S:string;
begin
            S
:='';
            
K:=0;
                        
            
i:=binsock.available;
            
            if 
i=(-1) then
            begin
            
... ОШИБКА ПОЛУЧЕНИЯ ДАННЫХ
            end 
ELSE if i<>0 then
                                BEGIN
                                K
:=0;
                                
repeat
                                
while ((ConnectError=true) and (binsock.available<>0) and (chr(k)<>'@')) do
                                        
begin
                                        k 
:= binsock.read_byte;
                                        if 
k=(-1) then 
                                                begin
                                                
... ОШИБКА ПОЛУЧЕНИЯ ДАННЫХ
                                                end 
else                                        
                                        if 
chr(k)<>'@' then S := S + chr(k);                                                                
                                        
end;
                                
until ((ConnectError=false) or (chr(k)='@'));
                                
END;
                                
            
ReadData:=S;                                                
end; 
Разкодирую данные в utf с помощью библиотеки proweb http://forum.boolean.name/showthread.php?t=8417
S:=base64_decode(S);
    
S:=encode(S, 'utf-8', 'ошибка'); 
P.S. Как правило работает на всех телефоннах
(Offline)
 
Ответить с цитированием