Боб прав .Это только мои сноски к его ответу.Имейте в виду, что я совершенно незнаком с zlib - я предполагаю, что вы вызываете DLL, используя Declare
для compress
.
Использование строки вместо массива байтов не означает, что вы избегаете преобразования ANSI.Часто это просто означает, что VB6 выполняет преобразование неявно , и вы не можете управлять им - например, когда вы вызываете DLL с оператором Declare
и передаете строку.
Возможно, магическая последовательность байтов, возвращаемых при сжатии, не является допустимой строкой "ANSI" на японской кодовой странице.Некоторые последовательности символов не определены в таблице MSDN для этой кодовой страницы.Если вы вызываете DLL с оператором Declare
и ожидаете, что строка будет возвращена в sCompressed, эта DLL лучше записать правильную строку «ANSI» в соответствующий буфер.Если он записывает неверную последовательность байтов, может произойти все что угодно.У вас также будут проблемы с китайским (936 и 950) и корейским (949).
То, что вы описываете, вполне может произойти: когда compress
возвращает неверную последовательность байтов, она может быть преобразована в "Unicode"msgstr "строка без сообщений об ошибках - возможно, усечённая строка Unicode, соответствующая первой части вашей последовательности байтов.Затем, когда вы позже попытаетесь распаковать, эта строка Unicode преобразуется обратно в строку ANSI, и она не соответствует исходной последовательности байтов, с которой вы начали.Это не может совпадать.На кодовой странице 932 нет возможной строки Unicode, которая преобразуется в строку «ANSI» в виде последовательности байтов, которая не является допустимой строкой.
Вот еще немного информации об ужасной путанице, которая представляет собой реализацию Unicode на VB6: бесплатная глава из превосходной книги Майкла Каплана Интернационализация с Visual Basic
Я также подозреваю, что вы можете путать количество символов в строке с количеством байтов, которое оно занимает в представлении ANSI (я с подозрением отношусь к lStringLen
и lcompressedlen
).Опять же, японский является двухбайтовым набором символов, поэтому строка ANSI может занять до 2 * N байтов для N символов.