Пытался на скоряк сделать утилитку для работы с FTP-сервером исходя из того что в Пурике есть FTP-функции.
Оказалось что на скоряк не получается т.к. уперся в проблему перекодировки для русских имен файлов и каталогов.
Информацию с некоторых серверов Пуриковские FTP-функции выдают в правильном виде, а с некоторых - в нечитаемом.
Отработав несколько идей по преодолению этой проблемы (в т.ч. и попытка написать собственную функцию перекодировки,
и применение разных версий Пурика, и даже использования сниффера)
после тщательного побайтного анализа я вроде бы понял причину.
IMHO (для 5.60) - при получении инфы с сервера Пурик побайтно переводит поток в UCS2.
И если поток идет в формате UTF8 получется каша.
Но если провести операцию обратного преобразования то получим нужную версию текста.
Соответственно - при посылке команд на сервер нужно их предварительно искаверкать
чтобы Пуриковские FTP-функции в свою очередь привели их к понимаемому сервером виду.
Я реализовал это в двух простых функциях. Пока косяков не вижу.
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Procedure.s FTP_UTF8_to_UCS2(In$) ;In$ - текст посланый сервером в формате UTF8 ;но FTP-функция пурика посчитала его ASCII-текстом и перекодировала в UCS2 ;Нужно сделать обратную операцию Protected *mem=Ascii(In$) ; вернем назал UCS2 в ASCII Protected txt1$=PeekS(*mem,MemorySize(*mem),#PB_UTF8 ) ;прочитаем как UTF8 => UCS2 FreeMemory(*mem) ProcedureReturn txt1$ EndProcedure Procedure.s UCS2_to_FTP_UTF8(In$) ;проделать операцию обратную FTP_UTF8_to_UCS2(In$) ;т.е. чтобы после того как FTP-функция пурика перекодирует UCS2 => ASCII ;получился UFT8 Protected *mem=UTF8(In$) Protected txt1$=PeekS(*mem, MemorySize(*mem), #PB_Ascii) FreeMemory(*mem) ProcedureReturn txt1$ EndProcedure |
работаю с ними так:
Например, при приеме с сервера когда на форме есть ЧекБокс перекодировки
Код:
1 2 3 4
| txt$=FTPDirectoryEntryName(glFTPh) If GetGadgetState(#Checkbox_UTF8)=#PB_Checkbox_Checked txt$=FTP_UTF8_to_UCS2(txt$) EndIf |
Например, при передаче на сервер когда на форме есть ЧекБокс перекодировки
Код:
1 2 3 4 5 6 7
| Protected txt$=FullPath$ If GetGadgetState(#Checkbox_UTF8)=#PB_Checkbox_Checked txt$=UCS2_to_FTP_UTF8(txt$) EndIf If SetFTPDirectory(glFTPh,txt$) ... EndIf |
--------------------
Если я сам создал себе проблему потому что не увидел что-то нужное в документации или на форуме
то убейте меня об стену и сотрите эту писанину.
-------------------
Всем - привет