Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.01.15;
Скачать: CL | DM;

Вниз

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

 
Nilman ©   (2012-07-23 15:51) [0]

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

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?( ‡Ww
Английский: xЪуHНЙЙWИ­T(П/КIQ8ябЕЈ§џЮѓ) ѕ#c

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

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

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


 
RWolf ©   (2012-07-23 16:10) [1]

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


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

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


 
brother ©   (2012-07-23 18:02) [3]

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


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


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

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


 
brother ©   (2012-07-23 18:44) [5]

а точно:
Hello my world


 
Nilman ©   (2012-07-24 14:09) [6]

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

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



Страницы: 1 вся ветка

Текущий архив: 2017.01.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
2-1424539948
Fox
2015-02-21 20:32
2017.01.15
Интернет ТВ


2-1421583719
Боб
2015-01-18 15:21
2017.01.15
Приостановка работы хука


15-1450042201
Юрий
2015-12-14 00:30
2017.01.15
С днем рождения ! 14 декабря 2015 понедельник


2-1424187609
TYMON
2015-02-17 18:40
2017.01.15
Технология Intraweb пустая страница при запуске


2-1420270918
Drowsy
2015-01-03 10:41
2017.01.15
IDE Object Inspector Font , Explorer