forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   MidletPascal (http://forum.boolean.name/forumdisplay.php?f=46)
-   -   Кодировка / декодировка данных через сокет (http://forum.boolean.name/showthread.php?t=12532)

LIDERSERVIS 20.05.2010 16:23

Кодировка / декодировка данных через сокет
 
Какие есть методы кодировки / розкодировки отправки данных через сокет (телефон не видит русские буквы через сокет - приходят карлюки), нужно включить аспект что могут в строчке идди как и руские так и английские буквы. пробывал через метод base64 - что то не получается :( . Кодую в Delphi (внизу) - забрасываю в decode_string библиотеки base64v3 - и снова получаю билиберду ? :SOS:
Возможно я не так кодирую или в библиотеке не тот алгоритм розкодировки ?

PHP код:

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


LIDERSERVIS 22.05.2010 02:39

Ответ: Кодировка / декодировка данных через сокет
 
:( :wild: :SOS:
Возможно Encode and Decode только внутрение ф-ции (сам себе закодировал и розкодировал) ?

ViNT 22.05.2010 02:48

Ответ: Кодировка / декодировка данных через сокет
 
Могу порекомендовать только попытаться раскодировать другой либой (вроде функция была в Lib_proweb), может я что-то в своей накосячил.
Но, скорее всего, где-то проблема с кодировками.

LIDERSERVIS 22.05.2010 02:57

Ответ: Кодировка / декодировка данных через сокет
 
Дякую. Попробую проверить свою кодировку ...

LIDERSERVIS 08.06.2010 02:21

Ответ: Кодировка / декодировка данных через сокет
 
Нашол ключ для кодировки даных через сокет. Но и тут загвоздка - работает только в емуляторе . Делаю так в Delphi:
1. поключаю бибилиотеку IdCoder3To4.
2. текст для кодировки сначала кодирую в формат UTF8, а потом в Base64.
PHP код:

S:=Form1.Edit......;

        
SS:=Utf8Encode(S);      
        
SS:=Base64Encode(SS); 

По такому принцыпу работают on-line кодировщики (например http://base64.ru/).
3. Отправляю кодированый текст через сокет, но - в емуляторе через процедуры decode получается, а телефон розкодирует какой то бред ?
4. Проблема есть ещо в кодирование текста в самом телефоне . Перепробывал кучу функций разных библиотек - проблема одна и таже. Телефон все буквы кирилицы заменяет на знак ?(вопроса) и только тогда кодирует. Здесь и вся загвоздка - я не могу сделать как с емулятором через пробы и ошибки вывод как кодировать - потому что телефон разный текст кирилицы кодирует похожим выходним текстом в base64. Возможно нужно как и в Delphi сначала перед base перекодировать в другой формат. Кто сталкивался с етим помогите пожалуйста.

P.S. еще раз о ошибки кодирования телефоном. Например текст телефон одинаково закодит как (Привет как дела) и (?????? ??? ????)

ViNT 08.06.2010 19:40

Ответ: Кодировка / декодировка данных через сокет
 
По идее, все перекодировки нужно делать в кодировке win-1251, т.е.:
1. берем текст, например, из TextField'a
2. Перекодируем его в win-1251
3. Кодируем в base64
обратно - наоборот:
1. Получаем текст в base64
2. Декодируем base64
3. Перекодируем текст в utf
4. Выводим

LIDERSERVIS 08.06.2010 21:03

Ответ: Кодировка / декодировка данных через сокет
 
Спасибо. Сегодня попробую

LIDERSERVIS 05.08.2010 04:47

Ответ: Кодировка / декодировка данных через сокет
 
Цитата:

1. берем текст, например, из TextField'a
2. Перекодируем его в win-1251
Снова загвоздка. Считывать данные с сокета сделал, а от отсылать - нет :( .
Вопрос в том как этот текст из TextField'a перекодировать в win-1251. В какой начальной кодировке этот текст - UTF или unicode. И как его перекодировать в win-1251. Примеров не нашел, хотя многие спрашивали !!!
На счет примеров, если из utf2win тогда они есть, но везде разные. Подскажите пожалуйста пример который уже испытан на практике.

LIDERSERVIS 28.05.2012 17:22

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

PHP код:

function AnsiToBase64(String):String;
var
        
SS string;
begin
        SS
:=Utf8Encode(S);
        
SS:=EncodeBase64(SS);
        
result:=SS;
end

где, Utf8Encode --- стандартная ф-ция библиотеки System

EncodeBase64 :
PHP код:

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. На мобильном клиенте
Считываю данные,

PHP код:

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
PHP код:

S:=base64_decode(S);
    
S:=encode(S'utf-8''ошибка'); 

P.S. Как правило работает на всех телефоннах


Часовой пояс GMT +4, время: 23:14.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot