+  HandyCache форум
|-+  Главная категория» Общие вопросы» Алгоритм преобразования URL в имя файла в кэше
Имя пользователя:
Пароль:
Страниц: [1] 2 3 ... 13   Вниз
  Отправить эту тему    Печать  
Автор Тема: Алгоритм преобразования URL в имя файла в кэше  (Прочитано 237732 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Сергей
Beta tester
*****

Репутация: +9/-2
Offline Offline

Сообщений: 621



« : 12 января 2007, 15:39:16 »

В документации не хватает подробного описания алгоритма преобразования URL2File.
Со всеми ньюансами, типа работы с дополнительными папками кэша.
Сообщить модератору   Записан
Дем
Постоялец
***

Репутация: +6/-3
Offline Offline

Сообщений: 167



« Ответ #1 : 12 января 2007, 16:31:32 »

В документации не хватает подробного описания алгоритма преобразования URL2File.
Со всеми ньюансами, типа работы с дополнительными папками кэша.
Ну вот что экспериментально нашёл:

:     !
/     #%
//    #%~
\     #~
|     #i
*     #x
?     #^
Сообщить модератору   Записан
Сергей
Beta tester
*****

Репутация: +9/-2
Offline Offline

Сообщений: 621



« Ответ #2 : 13 января 2007, 14:07:56 »

DenZzz

Цитировать
но это уже частность...

Не соглашусь. Способ хранения кэша ключевой момент программы отличающий ее от конкурентов.

Поэтому я просил выложить в паблик алгоритм преобразования чтобы всем вместе его обсудить, найти недоработки и исправить их до финала.

Как говорится Улыбка
Цитировать
Лучше один раз сделать правильно, чем потом переделывать.
Сообщить модератору   Записан
DenZzz
Модератор
*****

Репутация: +179/-11
Offline Offline

Сообщений: 5589



« Ответ #3 : 13 января 2007, 14:30:39 »

Сергей

Цитировать
Поэтому я просил выложить в паблик алгоритм преобразования чтобы всем вместе его обсудить, найти недоработки и исправить их до финала.

К сожалению, не владею полной информацией по этому вопросу...
Если кто может точно описать этот алгоритм словами - давайте.
Помнится, V0lt с ру-борда разбирался в коде и даже конвертор кэша написал...
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #4 : 13 января 2007, 22:51:57 »

Сергей
Цитировать
Поэтому я просил выложить в паблик алгоритм преобразования чтобы всем вместе его обсудить, найти недоработки и исправить их до финала.
Смотри вложение

* URLToCache.pas (15.71 Кб - загружено 325 раз.)
Сообщить модератору   Записан
DenZzz
Модератор
*****

Репутация: +179/-11
Offline Offline

Сообщений: 5589



« Ответ #5 : 14 января 2007, 01:37:10 »

Сергей (aka Сергей Кузнецов, ака COUSIN)

Цитата из ToDo:
Цитировать
Предлагаю тогда "!" тоже заменять на что-нибудь другое. Чтобы устранить неоднозначности. (C0USIN)

Судя по URLToCache.pas, это предложение уже реализовано!  Подмигивающий  ! заменяется на #I
Сообщить модератору   Записан
DenZzz
Модератор
*****

Репутация: +179/-11
Offline Offline

Сообщений: 5589



« Ответ #6 : 14 января 2007, 01:58:21 »

Как мы уже заметили в смежной теме, в действующем алгоритме символы: " < > - никак не преобразуются в имя файла, т.е. файл на диске просто не создается! Хорошо бы это поправить.
Еще надо решить, на что их заменять...  Подмигивающий

А кто помнит, почему некоторые "небезопасные" символы было решено заменять не на их код %хх , а на комбинацию: #y  ?
« Последнее редактирование: 14 января 2007, 02:35:59 от DenZzz » Сообщить модератору   Записан
Дем
Постоялец
***

Репутация: +6/-3
Offline Offline

Сообщений: 167



« Ответ #7 : 14 января 2007, 17:54:07 »

Кусок из моего...
Код:
    Private Function URL2FName(ByVal Url As String) As String
        Dim s As String
        If Url.EndsWith("/") Then Url &= DefFName
        URL2FName = Url.Replace("?", "^/").Replace("%3f", "^/").Replace("<", "#(").Replace(">", "#)").Replace("""", "#'").Replace("*", "#x").Replace("!", "#I").Replace(":", "!").Replace("|", "#i")
        If (MenuRepSl.Checked) Then
            Dim iq As Integer = URL2FName.IndexOf("^/") + 2
            If (iq >= 2 And URL2FName.Length > iq) Then
                URL2FName = URL2FName.Substring(0, iq) & URL2FName.Substring(iq).Replace("^/", "#^").Replace("//", "#%~").Replace("/", "#%").Replace("\", "#~")
            End If
        End If
    End Function

Но конечно выбор символа - дело автора.
Мне больше нравится § (критерий выбора - почти не встречается в урл, а также одинаково выглядит в  ANSI и OEM)
« Последнее редактирование: 14 января 2007, 18:11:43 от Дем » Сообщить модератору   Записан
Кирилл
Beta tester
*****

Репутация: +5/-1
Offline Offline

Сообщений: 124


« Ответ #8 : 16 января 2007, 14:46:50 »

Хм. А нельзя ли вынести правило преобразования "URL - имя файла в кеше" в файл настроек?
Сообщить модератору   Записан
Сергей
Beta tester
*****

Репутация: +9/-2
Offline Offline

Сообщений: 621



« Ответ #9 : 16 января 2007, 15:13:13 »

Я уже предлагал такое.
Алгоритм слишком сложный, чтобы его через файл настроек описать.
И медленно будет работать тогда.
Сообщить модератору   Записан
Кирилл
Beta tester
*****

Репутация: +5/-1
Offline Offline

Сообщений: 124


« Ответ #10 : 16 января 2007, 15:26:36 »

2 Сергей
Цитировать
Я уже предлагал такое.
Алгоритм слишком сложный, чтобы его через файл настроек описать.
И медленно будет работать тогда.
Немного странно. Собственно список "Преобразование URL" можно заставить делать практически то же самое.
Сообщить модератору   Записан
Сергей
Beta tester
*****

Репутация: +9/-2
Offline Offline

Сообщений: 621



« Ответ #11 : 16 января 2007, 15:39:51 »

Там не просто замена в URL некоторых символов.
Еще много других операций. Без обращения к диску никак не обойтись.
Например может оказаться что имя файла совпадает с именем каталога.
Еще есть две папки кэша, переадресация, докачка ....
« Последнее редактирование: 16 января 2007, 16:11:29 от Сергей » Сообщить модератору   Записан
Кирилл
Beta tester
*****

Репутация: +5/-1
Offline Offline

Сообщений: 124


« Ответ #12 : 19 января 2007, 09:37:22 »

Для получения относительного пути файла в кеше регулярные выражения вполне подойдут.
Ну а разрешение коллизий конечно лучше всего программное.
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #13 : 19 января 2007, 12:15:46 »

Кирилл
Цитировать
А нельзя ли вынести правило преобразования "URL - имя файла в кеше" в файл настроек?
И будет полная анархия, несовместимость кэшей и куча вопросов почему у меня что-то не кэшируется.
Сообщить модератору   Записан
Кирилл
Beta tester
*****

Репутация: +5/-1
Offline Offline

Сообщений: 124


« Ответ #14 : 19 января 2007, 12:21:26 »

2 mai62
Ну для полной анархии при кривых руках и текущих настроек хватит Подмигивающий
Собственно список "Преобразование URL" обладает тем же ресурсом для "Cache hell"
Сообщить модератору   Записан
Сергей
Beta tester
*****

Репутация: +9/-2
Offline Offline

Сообщений: 621



« Ответ #15 : 27 февраля 2007, 23:47:46 »

popkov
Цитировать
никак не уясню, почему один символ кодируется двумя кодами с "%", идущими подряд?
И ещё более непонятно, почему тогда можно то же закодировать одним кодом с "%", и это всё равно будет правильно обработано и будет означать то же самое (я имею в виду описанные мной выше два способа кодирования, один из которых в два раза короче другого)?
Однобайтовые коды неоднозначны. Одной и той же букве могут соответствовать разные коды, в зависимости от того, какую кодовою таблицу мы подразумеваем Win, koi-8, dos ...
Юникод решает эту проблему. Двухбайтовые коды, в данном случае, это UTF-8

Вот цитата с http://ru.wikipedia.org/wiki/Юникод
Цитировать
UTF-8 — это представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими 8-битные символы. Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байтов (на деле, только до 4 байт, поскольку использование кодов больше 221 не планируется), в которых первый байт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.
« Последнее редактирование: 27 февраля 2007, 23:52:38 от Сергей » Сообщить модератору   Записан
popkov
Beta tester
*****

Репутация: +3/-0
Offline Offline

Сообщений: 349


« Ответ #16 : 27 февраля 2007, 23:59:53 »

popkovОднобайтовые коды неоднозначны. Одной и той же букве могут соответствовать разные коды, в зависимости от того, какую кодовою таблицу мы подразумеваем Win, koi-8, dos ...
Юникод решает эту проблему. Двухбайтовые коды, в данном случае, это UTF-8

Вот цитата с http://ru.wikipedia.org/wiki/Юникод
Но всё равно непонятно - почему тогда сервер вернул двухбайтовый код, запросто сделав его из однобайтового? Он воспользовался информацией о языке вэб-страницы для этого?
Сообщить модератору   Записан
Сергей
Beta tester
*****

Репутация: +9/-2
Offline Offline

Сообщений: 621



« Ответ #17 : 28 февраля 2007, 00:05:11 »

Цитировать
А кто помнит, почему некоторые "небезопасные" символы было решено заменять не на их код %хх , а на комбинацию: #y  ?

По моему решение так и не было принято. Это личная инициатива автора.
Мне больше нравится вариант %xx для таких символов.
Сообщить модератору   Записан
Сергей
Beta tester
*****

Репутация: +9/-2
Offline Offline

Сообщений: 621



« Ответ #18 : 28 февраля 2007, 00:17:41 »

Но всё равно непонятно - почему тогда сервер вернул двухбайтовый код, запросто сделав его из однобайтового? Он воспользовался информацией о языке вэб-страницы для этого?

Сервер увидел неправильные коды и попытался восстановить их, предположив, что это WIN.
Сообщить модератору   Записан
v0lt
Beta tester
*****

Репутация: +7/-0
Offline Offline

Сообщений: 127


« Ответ #19 : 28 февраля 2007, 19:11:14 »

Вот я наконец-то на этом форуме Улыбка

Судя по URLToCache.pas, это предложение уже реализовано!  Подмигивающий  ! заменяется на #I
кхм, оно конечно более совместимо, но больше нравился вариант когда ! не трогается, а меняется ":" на "#I"

Цитата: DenZzz
А кто помнит, почему некоторые "небезопасные" символы было решено заменять не на их код %хх , а на комбинацию: #y  ?
для надежности и упрошения. в разных частях урла можно использовать разные комбинации символов. Например после "?" не обязательно кодировать символы запрешенные в host или path. К тому же в урле после "?" можно либо все закодировать, либо то что необходимо, и по сути получив два разных урла...

Цитата: popkov
пост с руборда:
Кстати, хотелось бы всё-таки узнать, что сейчас происходит с символами кавычек и <> при записи их на диск - они просто отбрасываются? И что будет с этой ситуацией в дальнейшем? Есть ли ещё такие символы?
Цитата: DenZzz
пост с руборда:
Нет, когда есть эти символы, то файл на диск не пишется совсем! Это баг...
двойные кавычки и <> в урле не могут исползоваться поэтому они кодируются браузером (%22 %3C %3E) и следовательно HC такие урлы нормально сохранит (можете проверить)

Цитата: popkov
пост с руборда:
Очень хотелось бы разобраться с двумя способами кодирования, один из которых в два раза короче
Тот что длинный %xx%xx, это как я понял UTF-16. Причем первый %xx должен быть больше %7F иначе будет распознан как ASCII символ.
Запрещеные символы ASCII (первые 128) кодируся как %xx, где xx - 16-ричный номер символа.

Короткий способ - это глюк (?) Firefox. Там вообще хх - это номер в cp1251. Я могу лишь предположить, что сервер wiki самостоятельно переводит к нормальному виду:
- браузер сообщяет желаемую кодировку и сервер это учитывает (очень сомнительно);
- сайт на русском, и урлы как правило на русском, следовательно програмисты движка сайта режили облегчить жизнь обычным пользователям

Сообщить модератору   Записан
Страниц: [1] 2 3 ... 13   Вверх
  Отправить эту тему    Печать  

 
Перейти в: