Кодирование русских букв в URL на PHP

12
EO
На сайте с 10.05.2005
Offline
114
11727

Здравствуйте!

Просьба помочь с кодированием ссылок, содержащих русские буквы.

Пример:

http://programma-biserok.ru/СКРИНШОТЫ/Схема целиком.png

Если ввести ее в браузер и скопировать оттуда, получим:

http://programma-biserok.ru/%D0%A1%D0%9A%D0%A0%D0%98%D0%9D%D0%A8%D0%9E%D0%A2%D0%AB/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0%20%D1%86%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%BC.png

Т.е. закодированы будут только русские буквы.

А кстати домены браузер вообще кодирует совсем по-другому...

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

Если использовать код на PHP, как советуют во всех мануалах:

$s='http://programma-biserok.ru/СКРИНШОТЫ/Схема целиком.png';

$s=iconv("Windows-1251","UTF-8", $s);//сайт в кодировке win-1251
print urlencode($s).BR;

то получаем ссылку:

_http%3A%2F%2Fprogramma-biserok.ru%2F%D0%A1%D0%9A%D0%A0%D0%98%D0%9D%D0%A8%D0%9E%D0%A2%D0%AB%2F%D0%A1%D1%85%D0%B5%D0%BC%D0%B0+%D1%86%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%BC.png

Такая ссылка не является валидной для скрипта сохранения из-за того, что в ней также закодированы все http, слеши, двоеточия и т.п., а не только русские буквы.

Так как же кодировать только русские буквы в URL, чтобы скрипт сохранения файлов на сервер мог работать с такими URL?

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

Бооольшой портал о мааалом бизнесе (http://www.bizguru.ru/) | Более 1000 бизнес-программ (http://1.44mb.ru) По выходным не работаю - не ищите меня в сети. В понедельник я обычно сам возвращаюсь :)
sanika
На сайте с 08.12.2015
Offline
58
#1

А если с помощью регулярки или parse_url разбить урл на сегменты, провести их через urlencode а потом сложить? Получите то же самое что и скопировав урл из окна браузера. Т.е. суть в том чтоб не шифровать служебные символы и домен

LinkBoss.net - Трастовые ссылки для увеличения трафика в 10 раз! (http://linkboss.net/)
EO
На сайте с 10.05.2005
Offline
114
#2

да, вариант, думал проще есть решение.

А домен нужно кодировать еще как-то по другому?

Ведь браузер выдает русские домены виде xn--...

sanika
На сайте с 08.12.2015
Offline
58
#3

Да, домен надо кодировать в punycode. Для этого нет стандартных функций и надо или юзать самописные - http://artkiev.com/blog/php-punycode-convert.htm или пакет Net_IDNA2 http://pear.php.net/package/Net_IDNA2/

EO
На сайте с 10.05.2005
Offline
114
#4

Придется значит целую функцию городить, которая будет кодировать русские буквы в Url через urlencode, а домен через punycode. Не ожидал, что все так сложно :(

sanika
На сайте с 08.12.2015
Offline
58
#5

Ну тут не настолько все сложно, зато раз сделал и забыл :)

EO
На сайте с 10.05.2005
Offline
114
#6

Согласен, все решаемо конечно, просто думал, что парой строк обойдусь, а не функцией + классом..

D.iK.iJ
На сайте с 26.05.2013
Offline
224
#7
eugene_o:
$s='http://programma-biserok.ru/СКРИНШОТЫ/Схема целиком.png';
$s=iconv("Windows-1251","UTF-8", $s);//сайт в кодировке win-1251
print urlencode($s).BR;

А что, нельзя как-то вывернуться?

$s='http://programma-biserok.ru/СКРИНШОТЫ/Схема целиком.png';

$s=iconv("Windows-1251","UTF-8", $s);//сайт в кодировке win-1251

$s=strstr(''http://programma-biserok.ru/', '');

print 'http://programma-biserok.ru/'.urlencode($s).BR;

Потом посмотреть на что меняется слеш и перед выводом заменить обратно через тот же strstr.

Можно вообще менять слеш до кодирования на что-то еще, а потом обратно

Адаптивный дизайн в 2 строчки ( https://dikij.com/wm/adaptaciya-saytov.php ). + Принимаю заказы любой сложности ( https://searchengines.guru/ru/forum/926323 ). 💎 Еще я делаю классные кулоны с опалами ( https://mosaicopal.ru/ ).
sanika
На сайте с 08.12.2015
Offline
58
#8

DiKiJ, это если у него один домен,а если несколько? В принципе да, если все будет работать на одном домене, то все гораздо проще. Слеш после шифрации это %2F

L
На сайте с 07.12.2007
Offline
351
#9
eugene_o:
Согласен, все решаемо конечно, просто думал, что парой строк обойдусь, а не функцией + классом..

Там и будет пара строк:


$s='http://programma-biserok.ru/СКРИНШОТЫ/Схема целиком.png';
$url = parse_url($s);
$arr = explode('/', $url{'path'}); // {} ЗАМЕНИТЬ на квадратные скобки, грёбаный парсер форума!!!
$coded = array_map('rawurlencode', $arr); // Обработать массив функцией rawurlencode
$restored = 'http://'.$url{'host'} // {} ЗАМЕНИТЬ на квадратные скобки, грёбаный парсер форума!!!
.implode('/', $coded); // Собрать перекодированный url обратно
# $restored = str_replace('%23', '#', $$restored); // Ибо rawurlencode заменяет якорь '#' на ''%23'
Более интересный вопрос - а где вы берёте эти url с русскими буквами? По RFC их не должно быть в url, те у вас что-то неправильно.

А вы ещё и перекодируете их с cp1251 в utf8, тогда как "русские" url должны быть сразу в utf8, иначе браузер не покажет их русскими буквами.

PS: Для IDN-доменов придётся заюзать функцию по-сложнее, но, опять, же, если брать доменное имя в "правильном месте" - оно должно быть сразу в пуникоде. Русскими буквами браузер только ОТОБРАЖАЕТ пуникод в адресной строке, а на самом деле там содержится xn-абракадабра.

богоносец
На сайте с 30.01.2007
Offline
753
#10
{} ЗАМЕНИТЬ на квадратные скобки

Есть ещё лазейка:

 [ квадратные скобки ] 

{} ЗАМЕНИТЬ на квадратные скобки

вместо

 [ квадратные скобки ] 

Браузеры создают зависимость от кодировки страницы, на которой оставили такую ссылку

httpsss://ru.wikipedia.org/wiki/Кондиционер

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий