Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сжатие данных в китайской Win7


Nilman ©   (2012-07-23 15:51:00) 

Обнаружилась проблема.. Есть код:

var
 PostData: string;
 SS1, SS2: TStringStream;  
 ZlibC: TIdCompressorZLib;
....

begin
...    
 PostData:='Hello my world Привет привет';

 SS1:=TStringStream.Create(PostData);
 SS2:=TStringStream.Create;
 ZlibC:=TIdCompressorZLib.Create(MainForm);
 try
   ZlibC.DeflateStream(SS1, SS2, 9);
   PostData:=SS2.DataString;
 finally
   SS1.Free;
   SS2.Free;
   ZlibC.Free;
 end;


Русскоязычной, англоязычной винде всё работает без нареканий. Начали жаловаться китайцы, что у них не работает. Поставил китайскую Win7 и проблема подтвердилась.
Сжимаем фразу которая в примере приведена и получаем в PostData:
Китайский: xЪуHНЙЙWИ­T(?КIQ?\x3(\x5 ‡W\x8w
Английский: xЪуHНЙЙWИ­T(П/КIQ8ябЕЈ§џ\x14Юѓ) ѕ#\x10c

Не вдаваясь что содержат эти символы видно что строки разные, несмотря на то что сжимаем одну и ту же строку, одним и тем же куском кода. Вопрос, как может быть связан язык ОС и функционирование алгоритмов deflate сжатия?

Ещё дополнение, пробовал вместо Indy либы использовать функции из Zlib, ZLibEx.pas:
PostData:=ZCompressStr(PostData);
Симптомы те же, ничего не меняется...

Помогите пож, голова уже взрывается, реально не знаю как решить проблему...
Пользуюсь Delphi XE.


Nilman   (2012-07-24 14:09:00) [1]

Решился вопрос! Кому интересно, вот решение:

function TScanThread.DrvDataPostWinInetAlg1(var SData: string): string;
var
 PostData: UTF8String;
 PostDataRaw: AnsiString;
 S1, S2: TMemoryStream;
 ZCompressionStream: TZCompressionStream;
......
begin
......
 PostData:=AnsiToUtf8(SData);

 S1:=TMemoryStream.Create;
 S2:=TMemoryStream.Create;
 ZCompressionStream:=TZCompressionStream.Create(S2, zcDefault);
 try
   S1.Write(PUTF8String(PostData)^, Length(PostData));
   S1.Position := 0;
   ZCompressionStream.CopyFrom(S1, S1.Size);
   ZCompressionStream.Free;
   PostDataRaw:=EncodeBase64(S2.Memory, S2.Size);
 finally
   S1.Free;
   S2.Free;
 end;


в PostDataRaw сжатая строка, закодированная в base64, готовая для отправки в теле POST запроса

Спасибо всем! Особая благодарность вот этому топику и всем его участникам)
http://www.cyberforum.ru/delphi-beginners/thread126613.html


brother   (2012-07-23 18:44:00) [2]

а точно:
Hello my world


Плохиш   (2012-07-23 18:23:00) [3]


> brother ©   (23.07.12 18:02) [3]

Дык, латиница конвертируется из кодировки в кодировку без проблем.


brother   (2012-07-23 18:02:00) [4]

меня напрягает, что некоторые символы, судя по
xЪуHНЙЙWИ­T(
жмутся верно...


Плохиш   (2012-07-23 16:13:00) [5]

1. Использовать только юникодовые строки
2. Не использовать tstringstream, т.к. оно, судя по описанию, преобразовывает все строки в анси.


RWolf   (2012-07-23 16:10:00) [6]

кодировки безобразничают, видимо.
общее направление поиска: класть сырые данные в RawString или TBytes (или просто выделять под них буфер в памяти).


Наверх

Титульная страница Поиск, карта сайта Написать письмо