Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для мобильных телефонов > MidletPascal

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

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

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
(Offline)
 
Ответить с цитированием
Старый 21.05.2010, 22:39   #2
LIDERSERVIS
Оператор ЭВМ
 
Регистрация: 20.10.2009
Сообщений: 49
Написано 2 полезных сообщений
(для 3 пользователей)
Ответ: Кодировка / декодировка данных через сокет


Возможно Encode and Decode только внутрение ф-ции (сам себе закодировал и розкодировал) ?
(Offline)
 
Ответить с цитированием
Старый 21.05.2010, 22:48   #3
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Кодировка / декодировка данных через сокет

Могу порекомендовать только попытаться раскодировать другой либой (вроде функция была в Lib_proweb), может я что-то в своей накосячил.
Но, скорее всего, где-то проблема с кодировками.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LIDERSERVIS (21.05.2010)
Старый 21.05.2010, 22:57   #4
LIDERSERVIS
Оператор ЭВМ
 
Регистрация: 20.10.2009
Сообщений: 49
Написано 2 полезных сообщений
(для 3 пользователей)
Ответ: Кодировка / декодировка данных через сокет

Дякую. Попробую проверить свою кодировку ...
(Offline)
 
Ответить с цитированием
Старый 07.06.2010, 22:21   #5
LIDERSERVIS
Оператор ЭВМ
 
Регистрация: 20.10.2009
Сообщений: 49
Написано 2 полезных сообщений
(для 3 пользователей)
Ответ: Кодировка / декодировка данных через сокет

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

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

P.S. еще раз о ошибки кодирования телефоном. Например текст телефон одинаково закодит как (Привет как дела) и (?????? ??? ????)
(Offline)
 
Ответить с цитированием
Старый 08.06.2010, 15:40   #6
ViNT
Модератор
 
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений
(для 817 пользователей)
Ответ: Кодировка / декодировка данных через сокет

По идее, все перекодировки нужно делать в кодировке win-1251, т.е.:
1. берем текст, например, из TextField'a
2. Перекодируем его в win-1251
3. Кодируем в base64
обратно - наоборот:
1. Получаем текст в base64
2. Декодируем base64
3. Перекодируем текст в utf
4. Выводим
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LIDERSERVIS (08.06.2010)
Старый 08.06.2010, 17:03   #7
LIDERSERVIS
Оператор ЭВМ
 
Регистрация: 20.10.2009
Сообщений: 49
Написано 2 полезных сообщений
(для 3 пользователей)
Ответ: Кодировка / декодировка данных через сокет

Спасибо. Сегодня попробую
(Offline)
 
Ответить с цитированием
Старый 05.08.2010, 00:47   #8
LIDERSERVIS
Оператор ЭВМ
 
Регистрация: 20.10.2009
Сообщений: 49
Написано 2 полезных сообщений
(для 3 пользователей)
Ответ: Кодировка / декодировка данных через сокет

1. берем текст, например, из TextField'a
2. Перекодируем его в win-1251
Снова загвоздка. Считывать данные с сокета сделал, а от отсылать - нет .
Вопрос в том как этот текст из TextField'a перекодировать в win-1251. В какой начальной кодировке этот текст - UTF или unicode. И как его перекодировать в win-1251. Примеров не нашел, хотя многие спрашивали !!!
На счет примеров, если из utf2win тогда они есть, но везде разные. Подскажите пожалуйста пример который уже испытан на практике.
(Offline)
 
Ответить с цитированием
Старый 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 18:55.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com