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

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

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

EncodeBase64 :
function EncodeBase64(ValueString): String;
const 
 
b64alphabetPChar 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  
padPChar '===='

  function 
EncodeChunk(const ChunkString): String
  var 
    
WLongWord
    
inByte
  
begin 
    n 
:= Length(Chunk); := 0
    for 
:= 0 to n do 
      
:= Ord(Chunk[1]) shl ((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 
<> 3 then 
      Result 
:= Copy(Result01) + Copy(pad0n); 
  
end

begin 
  Result 
:= ''
  while 
Length(Value) > do 
  
begin 
    Result 
:= Result EncodeChunk(Copy(Value03)); 
    
Delete(Value13); 
  
end
end
********************************************

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

Function ReadData():string;
var
        
kinteger;
        
S:string;
begin
            S
:='';
            
K:=0;
                        
            
i:=binsock.available;
            
            if 
i=(-1then
            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=(-1then 
                                                begin
                                                
... ОШИБКА ПОЛУЧЕНИЯ ДАННЫХ
                                                end 
else                                        
                                        if 
chr(k)<>'@' then 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)
 
Ответить с цитированием