:: Visual Foxpro, Foxpro for DOS
Преобразование URL
Димон71

Сообщений: 80
Дата регистрации: 08.02.2005
Есть url адрес в формате %d1%81%d0%bf%d0%be%d1%80%d1%82 как его привести в нормальный вид?
Ratings: 0 negative/0 positive
Re: Преобразование URL
of63
Автор

Сообщений: 25240
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Это 2 кодирования: % - это URL-кодирование, d0 - значит UTF8. на форуме все это было. forum.foxclub.ru
Ratings: 0 negative/0 positive
Re: Преобразование URL
Димон71

Сообщений: 80
Дата регистрации: 08.02.2005
Спасибо. Искал на форуме не по тем ключевикам оказывается
Ratings: 0 negative/0 positive
Re: Преобразование URL
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
of63
на форуме все это было. forum.foxclub.ru

Да можно и проще - на самом фоксе написать. Несколько строк кода.
Когда-то на заре XML еще для FPD писал преобразование в UTF8 (потом как-то и в решения выкладывал). Здесь примерно аналогично. Даже еще проще, поскольку обратное преобразование.
Причем будет работать хоть даже под FPD.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Преобразование URL
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Вообще-то именно %d1%81.... и есть нормальный вид url - поскольку кириллица, пробелы, многие спецсимволы и т.п. в адресах запрещены.
А "спорт..." - это уже просто "красивое представление" закодированного url-а. Конкретно для расшифровки url-кодированного utf8 текста можно использовать STRCONV(STRCONV("%d1%81%d0%bf%d0%be%d1%80%d1%82",16),11)
Однако так можно делать только если ВЕСЬ текст закодирован - иначе вместо внутреннего STRCONV нужно будет вручную по строке проходить и %dd заменять на CHR(0xdd) - т.е. на соответствующий символ - а внешний STRCONV оставить как есть.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Преобразование URL
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Igor Korolyov
поскольку кириллица, пробелы, многие спецсимволы и т.п. в адресах запрещены.

Если не считать, что периодически (сейчас уже вроде потише) возникают компании за "национальные адреса". В частности домен ".РФ", на который правда до сих пор, как пишут, мало кто позарился. Вот посмотри например http://россия.рф/ - там не конвертированное. Аналогично и некоторые националы свои языки следом вставили. Слегка бессмысленно в принципе. Отгородиться от всего мира если только. Ведь если скажем у тех же китайцев в адресах будут "натуральные" иероглифы - ну кто к ним войдет, кроме тех, у кого стоит китайский язык в системе. Так же и со всеми остальными.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Преобразование URL
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Кириллические (и всякие "иероглифические") домены конвертируются ещё круче - там punycode и простого/штатного преобразования (в фоксе, имеется в виду) между ним и "человекочитаемым" видом нет.
Твой пример "россия.рф/" в натуральном виде будет выглядеть как "xn--h1alffa9f.xn--p1ai/"
Ну что ж, внедрение этих самых "национальных доменов" просто подтверждает известный тезис о том что 90% человеков в любой выборке (IT-ников, или чиновников) это идиоты


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Преобразование URL
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Вчера еще когда было время накидал решение на чистом фоксе, идею которого упоминал выше.
Добавил в раздел "Решения". Но не знаю, как сейчас с добавкой туда, как часто Joys сейчас заглядывает. Кажется давно уже его не видно было.
На всякий случай сдублирую сюда.
Может кому-то и пригодится.

CLEAR
* Процедура для преобразования из URL в ASCII или обратно (при задании 2х параметров)
* Синтаксис:
* URL_ASCII(cStr [,nInter])
* Параметры:
* cStr - символьный, строка для преобразования
* nInter - любое число,
* при наличии - выполняется преобразования из ASCII в URL,
* при отсутствии - выполняется преобразование из URL в ASCII
* Возвращаемое значение - преобразованная строка
* Применение:
* преобразование в ASCII
cStr = "https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"
? URL_ASCII(cStr) && "https://ru.wikipedia.org/wiki/Заглавная_страница"
* преобразование в URL
cStr = "https://ru.wikipedia.org/wiki/Заглавная_страница"
? URL_ASCII(cStr,1) && "https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"
CANCEL
************************
PROCEDURE URL_ASCII
LPARAMETERS cStr, nInter
LOCAL cExpr1,cExpr2,a1,a2,lni
STORE '' TO cExpr1, cExpr2
FOR lni=1 TO 66
cExpr1 = cExpr1+"STRTRAN("
ENDFOR
FOR lni=1 TO 64
IF PARAMETERS()=1
a1 = "'%D"+IIF(lni<49,"0","1")+"%"+SUBSTR("9AB8",INT((lni-1)/16)+1,1)+SUBSTR("0123456789ABCDEF",(lni-1)%16+1,1)+"'"
a2 = "'"+CHR(192+lni-1)+"'"
ELSE
a2 = "'%D"+IIF(lni<49,"0","1")+"%"+SUBSTR("9AB8",INT((lni-1)/16)+1,1)+SUBSTR("0123456789ABCDEF",(lni-1)%16+1,1)+"'"
a1 = "'"+CHR(192+lni-1)+"'"
ENDIF
cExpr2 = cExpr2+","+a1+","+a2+")"
ENDFOR
RETURN EVALUATE(cExpr1+"'"+cStr+"'"+cExpr2+",'%D0%81','Ё'),'%D1%91','ё')")
ENDPROC
************************

Все на чистом фоксе, при желании можно, немного адаптировав (первые две команды и кодировку), использовать даже в FPD.
На моих примерах вроде все показывает как надо.
[sm128]


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Преобразование URL
akvvohinc

Сообщений: 4212
Откуда: Москва
Дата регистрации: 11.11.2008
Crispy
FOR lni=1 TO 66
   cExpr1 = cExpr1+"STRTRAN("
ENDFOR

Красиво, конечно, но почему не банальный REPLICATE().



Исправлено 1 раз(а). Последнее : akvvohinc, 30.03.17 08:13
Ratings: 0 negative/0 positive
Re: Преобразование URL
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
akvvohinc
Crispy
FOR lni=1 TO 66
   cExpr1 = cExpr1+"STRTRAN("
ENDFOR

Красиво, конечно, но почему не банальный REPLICATE().

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

С учетом твоей поправки еще короче получается:

************************
PROCEDURE URL_ASCII
LPARAMETERS cStr, nInter
LOCAL cExpr,a1,a2,lni
cExpr = ''
FOR lni=1 TO 64
IF PARAMETERS()=1
a1 = "'%D"+IIF(lni<49,"0","1")+"%"+SUBSTR("9AB8",INT((lni-1)/16)+1,1)+SUBSTR("0123456789ABCDEF",(lni-1)%16+1,1)+"'"
a2 = "'"+CHR(192+lni-1)+"'"
ELSE
a2 = "'%D"+IIF(lni<49,"0","1")+"%"+SUBSTR("9AB8",INT((lni-1)/16)+1,1)+SUBSTR("0123456789ABCDEF",(lni-1)%16+1,1)+"'"
a1 = "'"+CHR(192+lni-1)+"'"
ENDIF
cExpr = cExpr+","+a1+","+a2+")"
ENDFOR
RETURN EVALUATE(REPLICATE("STRTRAN(",66)+"'"+cStr+"'"+cExpr+",'%D0%81','&#168;'),'%D1%91','&#184;')")
ENDPROC
************************

А если вдобавок не нужно обратное преобразование - то и вообще коротко:

************************
PROCEDURE URL_ASCII
LPARAMETERS cStr
LOCAL cExpr,lni
cExpr = ''
FOR lni=1 TO 64
cExpr = cExpr+",'%D"+IIF(lni<49,"0","1")+"%"+SUBSTR("9AB8",INT((lni-1)/16)+1,1)+SUBSTR("0123456789ABCDEF",(lni-1)%16+1,1)+"','"+CHR(192+lni-1)+"')"
ENDFOR
RETURN EVALUATE(REPLICATE("STRTRAN(",66)+"'"+cStr+"'"+cExpr+",'%D0%81','&#168;'),'%D1%91','&#184;')")
ENDPROC
************************


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 30.03.17 08:35
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 25 (Гостей: 25)

© 2000-2024 Fox Club 
Яндекс.Метрика