purebasic.info

PureBasic forum
Текущее время: Пн апр 23, 2018 1:12 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: Вт мар 06, 2018 9:44 am 
Не в сети
студент

Зарегистрирован: Вт мар 06, 2018 7:45 am
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пытался на скоряк сделать утилитку для работы с 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



--------------------
Если я сам создал себе проблему потому что не увидел что-то нужное в документации или на форуме
то убейте меня об стену и сотрите эту писанину.
-------------------
Всем - привет


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB