Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1308557586
MacroDenS
2011-06-20 12:13
2017.01.15
ADO + Excel


2-1426067911
aka
2015-03-11 12:58
2017.01.15
TObject через ссылку


4-1279284463
POP
2010-07-16 16:47
2017.01.15
Есть ли смысл (сейчас) в Win_Inet_API?


15-1453566333
Fragen
2016-01-23 19:25
2017.01.15
Как пишутся приложения для нахождения оптимального маршрута?


2-1418843283
AlexeyTG
2014-12-17 22:08
2017.01.15
Запуск двух программ с ожиданием завершения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский