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

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

Сообщений: 5589



« Ответ #80 : 13 марта 2007, 15:55:53 »

Тем, что мы не знаем наверняка, какая там кодировка на самом деле.

Можно попытаться это определить! Наглядный пример - сервер Яндекса, который сам определяет кодировку в запросе!
Коды символов в UTF-8 всегда "двойные" и начинаются с %D0 или %D1 - это можно использовать для определения кодировки в URL-е...

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

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

Еще не стоит забывать, что HC работает под Windows и свой WIN есть в каждой локализованной Винде!

На счет KOI-8 - можешь привести реальный рабочий URL, где используется кодировка KOI-8 без явного на то указания в самом URL-е?

Цитировать
http://forum.ru-board.com/forum.cgi?action=filter&forum=35&filterby=topictitle&word=Пример
Браузер добросовестно закодирует в юникод
http://forum.ru-board.com/forum.cgi?action=filter&forum=35&filterby=topictitle&word=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80
а сервер этого не поймет.

Во-первых, не каждый браузер перекодирует эту строку в Юникод! Мой отправляет в неизменном виде и получает правильный ответ! Подмигивающий

А во-вторых, тот сервер ру-борда не понимает Юникод, но зато прекрасно понимает WIN:
http://forum.ru-board.com/forum.cgi?action=filter&forum=35&filterby=topictitle&word=%CF%F0%E8%EC%E5%F0
Именно в таком виде страница ру-борда отправляет запрос на свой сервер, когда ты фильтруешь там темы в списке!

Кодировка WIN применяется во многих URL и на многих сайтах! Так почему же не хранить подобные URL-ы на диске в "прозрачном", читабельном виде?!
Сообщить модератору   Записан
v0lt
Beta tester
*****

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

Сообщений: 127


« Ответ #81 : 13 марта 2007, 19:13:45 »

DenZzz
Цитировать
Коды символов в UTF-8 всегда "двойные" и начинаются с %D0 или %D1 - это можно использовать для определения кодировки в URL-е...
русская буква "Р" - код D0h
русская буква "С" - код D1h Грустный
серверу легче, если получается два варианта, то он может глянуть какая из страниц у него есть.

Цитировать
А во-вторых, тот сервер ру-борда не понимает Юникод, но зато прекрасно понимает WIN:
тут еще проще, сервер на поисковые запросы уже ожидает Win-1251, который генерируется скриптом страницы

Цитировать
Кодировка WIN применяется во многих URL и на многих сайтах! Так почему же не хранить подобные URL-ы на диске в "прозрачном", читабельном виде?!
Можно попробовать сделать опционалное правило для сайтов в урлах которых используется Win-1251.
Сообщить модератору   Записан
popkov
Beta tester
*****

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

Сообщений: 349


« Ответ #82 : 13 марта 2007, 20:56:31 »

серверу легче, если получается два варианта, то он может глянуть какая из страниц у него есть.
HC тоже может глянуть, какая страница в кэше уже есть...
Сообщить модератору   Записан
DenZzz
Модератор
*****

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

Сообщений: 5589



« Ответ #83 : 13 марта 2007, 21:09:12 »

русская буква "Р" - код D0h
русская буква "С" - код D1h Грустный

Это да, но можно пропарсить весь URL, откинув коды спецсимволов, и посмотреть, а не является ли каждый нечетный код D0 или D1. Если является, то проверить "пары" на вхождение в таблицу UTF-8. Так мы с большой степенью вероятности сможем правильно отличить UTF-8 от Win-1251. В общем, это возможно... Улыбка

Цитировать
серверу легче, если получается два варианта, то он может глянуть какая из страниц у него есть.

Не всегда у сервера есть эта страница, чтобы сверить! Пример с Яндексом я уже приводил:
http://www.yandex.ru/yandsearch?text=%CF%F0%E8%EC%E5%F0
http://www.yandex.ru/yandsearch?text=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80

Оба запроса выводят одинаковый результат поиска, хотя сервер не знал ничего о кодировке критерия поиска! Значит у него есть алгоритм выяснения правильной кодировки!

Цитировать
Можно попробовать сделать опционалное правило для сайтов в урлах которых используется Win-1251.

Можно и так, если не получится прикрутить автораспознание кодировок.



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

Структура перекодировочного файла видится мне примерно такой:

Код:
[UTF-8]
%D0%90 А
...
%D1%8F я
URL=ru\.wikipedia\.org/
URL=...

[WIN-1251]
%C0 А
...
%FF я
URL=+yandex.ru
URL=...

[KOI8-R]
и т.д.

Таким образом, каждый сможет сам править коды символов, добавлять свои кодировочные таблицы (полезно для иностранцев) и задавать сайты, для которых будет применяться та или иная перекодировка.
Сообщить модератору   Записан
Сергей
Beta tester
*****

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

Сообщений: 621



« Ответ #84 : 14 марта 2007, 09:02:19 »

Можно попытаться это определить! Наглядный пример - сервер Яндекса, который сам определяет кодировку в запросе!
Я имел в виду WIN и KOI. Однобайтовую кодировку от юникода отличить легко, разумеется.

Цитировать
Пока Россия - это основная целевая аудитория, но, заботясь о будущем, можно вынести перекодировочную таблицу в отдельный файл-список.
Возможно и так.

Цитировать
Во-первых, не каждый браузер перекодирует эту строку в Юникод! Мой отправляет в неизменном виде и получает правильный ответ! Подмигивающий
Ты случайно не кликнул на этой ссылке? Надо было скопировать строку вручную. Форумный движок сам заменил русские буквы на коды.

Цитировать
Кодировка WIN применяется во многих URL и на многих сайтах! Так почему же не хранить подобные URL-ы на диске в "прозрачном", читабельном виде?!
Согласен. При условии сохранения информации о кодировке для возсожности обратного преобразования.
Сообщить модератору   Записан
Сергей
Beta tester
*****

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

Сообщений: 621



« Ответ #85 : 14 марта 2007, 11:03:46 »

Цитировать
можешь привести реальный рабочий URL, где используется кодировка KOI-8 без явного на то указания в самом URL-е?
Не могу сейчас припомнить. Но совершенно точно есть сайты с кодировкой отличной от WIN.

Возможно стоит вытаскивать кодовую страницу из заголовков ответа сервера.
Сообщить модератору   Записан
v0lt
Beta tester
*****

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

Сообщений: 127


« Ответ #86 : 14 марта 2007, 20:18:57 »

пишу алгоритм... дошел до декодирования уникода (%xx%xx) и пробела (%20)
обнаружил неприятность в алгоритме:

Согласно алгоритму после символа "?" имеем / -> #%
если имеем урл вида - site.com/page.htm?100/20=5
то получим - site.com\page.htm^\100#%20=5
Если за основными преобразованиями последует декодирование кодов вида %xx, то получим глюки. Придется его ставить в начале Грустный
Если сделаем конвертер кеша, который будет преобразовывать %xx согласно поддерживаемым в НС кодировкам, то надо будет не забыть проверку на наличие символа # перед %. Вот такие заморочки...

Еще вариант не использовать #% (совместимость пострадает). Взамен остались #; #, #z или #! (если : -> #=)
Сообщить модератору   Записан
popkov
Beta tester
*****

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

Сообщений: 349


« Ответ #87 : 14 марта 2007, 20:26:52 »

Еще вариант не использовать #% (совместимость пострадает). Взамен остались #; #, #z или #! (если : -> #=)
В общем-то, для кодирования слэша "/" комбинация "#!" прозрачнее, чем "#%". Так что поддерживаю! К тому же, для конвертера кэша заменить все вхождения "#%" на "#!" не так уж сложно...
Сообщить модератору   Записан
v0lt
Beta tester
*****

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

Сообщений: 127


« Ответ #88 : 14 марта 2007, 22:51:41 »

Сделал первый вариант кодирования (пока не все фичи)
измения v1.1:
/ -> #!
// -> \#! -?- #!#!
: -> #=
файлы прилагаются
внутри архива таблица "что и как" и конвертор (нужен dotNetFX 2, идет с некоторыми крупными прогами и игрушками)
Конвектор работает очень просто, вводите урл и видите как он будет выглядеть на диске и как он востанавливается обратно...

* URL2filename_ver1_1.zip (12.14 Кб - загружено 36 раз.)
Сообщить модератору   Записан
DenZzz
Модератор
*****

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

Сообщений: 5589



« Ответ #89 : 14 марта 2007, 23:09:23 »

файлы прилагаются

Опять остались пустые ячейки в столбце "после "?" !

Цитировать
внутри архива таблица "что и как" и конвертор (нужен dotNetFX 2, идет с некоторыми крупными прогами и игрушками)

Помнится, раньше ты делал конвертер, работающий без .NET ...
Если менять существующий алгоритм URLToCache, то понадобится конвертер, работающий на всех системах (даже на Win98) и без установленного .NET !
Сообщить модератору   Записан
v0lt
Beta tester
*****

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

Сообщений: 127


« Ответ #90 : 15 марта 2007, 07:01:16 »

DenZzz
Цитировать
Опять остались пустые ячейки в столбце "после "?" !
ну понятно же... (поправил у себя) Улыбка

DenZzz
Цитировать
Помнится, раньше ты делал конвертер, работающий без .NET ...
Если менять существующий алгоритм URLToCache, то понадобится конвертер, работающий на всех системах (даже на Win98) и без установленного .NET !
было такое, но там был конвертор работающий с самим кешем...
когда дойдет до настоящего конвертора переведу код на Дельфи (наверно за основу возьму предыдущий вариант). сейчас пишу на C#, мне так проще...

PS: Есть Turbo Delphi (BDS2006) на нем можно безпроблемно написать для Win98 или нужен Delphi 7 ?
Сообщить модератору   Записан
Rick
Администратор
*****

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

Сообщений: 868


WWW
« Ответ #91 : 15 марта 2007, 07:47:23 »

PS: Есть Turbo Delphi (BDS2006) на нем можно безпроблемно написать для Win98 или нужен Delphi 7 ?
Не важно на чем писать - важно какие функции используются.
Сообщить модератору   Записан
Сергей
Beta tester
*****

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

Сообщений: 621



« Ответ #92 : 15 марта 2007, 14:55:07 »

Если менять существующий алгоритм URLToCache, то понадобится конвертер, работающий на всех системах (даже на Win98) и без установленного .NET !
Чем тебе .Net не угодил? Он и под Win98 ставится. Я бы и сам HC под Net не отказался использовать. С совместимостью было-бы намного лучше.
Сообщить модератору   Записан
DenZzz
Модератор
*****

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

Сообщений: 5589



« Ответ #93 : 15 марта 2007, 18:12:34 »

Чем тебе .Net не угодил? Он и под Win98 ставится.

1. Тем, что не у всех он есть, а качать только ради конвертера кэша 23 метра Microsoft .NET Framework 2.0/1.1 или даже 50 метров v3.0 тем, кто не имеет безлимитной выделенки и считает каждый МБ, пользуясь HandyCaсhe, - похоже на неудачную шутку...  Подмигивающий

2. Надо предусмотреть возможность интеграции конвертера в сам HC, если mai62 сочтет нужным, т.к. это облегчит пользователям переход на новую версию HC, которая написана на Дельфи и самодостаточно работает с любой версией Windows, не имеющей .NET !


Цитировать
Я бы и сам HC под Net не отказался использовать. С совместимостью было-бы намного лучше.

Совместимостью с чем и для чего?
Сообщить модератору   Записан
v0lt
Beta tester
*****

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

Сообщений: 127


« Ответ #94 : 15 марта 2007, 20:09:28 »

Rick
Цитировать
Не важно на чем писать - важно какие функции используются.
ну я бы не сказал, например C# вообще без dotNET не напишешь
был Delphi 8 - это вообще непонятно что, старые проекты не компилятся
Сейчас стоит Turbo Delphi 10 (Borland Developer Studio 2006) вроде нормально, проекты из Delphi 7 запускаются

Всем
Не беспокойтесь, будет конвертор без .NET. Сделаю когда отладим алгоритм и mai62 дасть добро...
Сообщить модератору   Записан
Rick
Администратор
*****

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

Сообщений: 868


WWW
« Ответ #95 : 15 марта 2007, 20:25:07 »

v0lt
Ты спрашивал про D7 и D10 - я про них и отвечал. С# и дотнетовские версии Delphi в вопросе не фигурировали.
Сообщить модератору   Записан
Сергей
Beta tester
*****

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

Сообщений: 621



« Ответ #96 : 16 марта 2007, 11:02:12 »

2. Надо предусмотреть возможность интеграции конвертера в сам HC
Абсолютно верно. Причем еще нужен ручной конвертор. Без него пока сложно использовать список Преобразование URL без потери имеющихся в кэше данных.

Совместимостью с чем и для чего?
С Windows Mobile. Чтобы иметь возможность использовать HC и на коммуникаторе.
Сообщить модератору   Записан
v0lt
Beta tester
*****

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

Сообщений: 127


« Ответ #97 : 18 марта 2007, 10:13:31 »

Доработал алгоритм:
измения v1.2:
-Пометка заглавных букв
-Поддержка win-1251
файлы прилагаются

* URL2filename_ver1_2.zip (15.54 Кб - загружено 40 раз.)
Сообщить модератору   Записан
v0lt
Beta tester
*****

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

Сообщений: 127


« Ответ #98 : 19 марта 2007, 07:05:35 »

Так, думаю стоит обсудить проблему длинных урлов.
Эту тему я как-то обсуждал с mai62, но в тот момент революция не планировалось, поэтому этот ворпрос был отложен...

Сейчас алгоритм работает так:
  На последнем этапе преобразования урла в имя файла проверяется длина имени (относительно папки кеша). Если она больше 200, то мы находим последний символ "\" в пределах первых 192 символов. Строку до символа "\" оставляем, а оставшееся кодируем хешем CRC32:

[путь<192]\[CRC32(путь>192)]


Я предлагаю:
- высчитывать CRC32 на основе URL, а не имени файла. Так будет более однозначный результат и меньше вероятнось потерь при преобразованиях.
(урл брать уже пофиксеный, без багов IE)
- помечать строку хеша. Так будет стразу понятно, что это урл был длинным.
- сделать опцию типа "Для длинных URL сохранять *.url". Возможно кому-то может понадобиться узнать реальный урл.

Алгоритм такой:
 Проверяем длину имени (относительно папки кеша). Если она больше 200, то мы находим последний символ "\" в пределах первых 190 символов. Строку до символа "\" оставляем, плюс добавляем помеченный хеш урла без хоста. Помечать предлагаю кодом #- :

[путь<190]\#-[CRC32(урл_без_хоста)]   

 IMHO Хост кодить не надо. Причины: В зависимости от настроек .www может как отбрасываться, так и нет. Иногда сайты меняют хостинг, оставляя структуру, и чтобы ничего не пропало, юзер может просто переименовать соответствующую папку.
+ очень легко реализуемо
+ на CRC практически ничего не влияет


Сообщить модератору   Записан
DenZzz
Модератор
*****

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

Сообщений: 5589



« Ответ #99 : 19 марта 2007, 07:22:49 »

v0lt

Как быть с длинными URL, которые сейчас уже сохранены в кэше?
Переконвертировать их по новому алгоритму не получится, т.к. исходный URL мы восстановить не можем!
Сообщить модератору   Записан
Страниц: 1 ... 3 4 [5] 6 7 ... 13   Вверх
  Отправить эту тему    Печать  

 
Перейти в: