Форум: "Основная";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
ВнизСжатие данных в китайской 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.057 c