локаль UTF-8 под windows

homm

Новичок
локаль UTF-8 под windows

Добрый день. У меня проблема с которой я истрахал весь мозг гуглу, но решения так и не нашел.

Я пишу приложение под windows, используя фреймворк, который работает под utf-8 и использует функцию parse_url. Как оказалось, результат выполнения этой функции зависит от текущей локали и при передаче ей utf-8 строки при выставленной иной локали, результат может быть не предсказуемым. Это можно проверить на следующем примере:

PHP:
$str = "АБВГДЕЁЖЗИКЛМНОПРСТУФХЧШЩЪЫЬЭЮЯабвгдеёжзиклмнопрстуфхчшщъыьэюя";
echo "<hr>".$str."<hr>";
echo parse_url($str, PHP_URL_PATH)."<hr>";
у меня результат выполнения для локали «Russian_Russia» такой:
АБВГДЕЁЖЗИКЛМНОПРСТУФХЧШЩЪЫЬЭЮЯабвгдеёжзиклмнопрстуфхчшщъыьэюя
АБВГДЕЁЖЗ&#65533;_КЛМНОПРСТУФХЧШЩЪЫЬЭЮЯабвгдеёжзиклмнопрстуфхчшщъыьэюя
соответствеено, нужно поставить верную локаль, тобишь «Russian_Russia.UTF-8» или любую другую utf-8 локаль. Или может быть как-то другим способом, без локалей выправить внутреннюю кодировку PHP. Под линуксом проблем нет, там локали на основе UTF-8 родные, а как это сделать под windows — я так и не нашел решения.
 

DiMA

php.spb.ru
Команда форума
у меня есть свой аналог этой функции, т.е. при желании ее можно и до утф8 доработать

А вот че понять не могу - нафига какие-то русские строки в функцию суешь? Покажи конкретный урл, с которым функция не справляется.
 

Gorynych

Посетитель PHP-Клуба
попробуйте setlocale(LC_ALL, array('UTF-8', 'ru_RU.utf8','en_US.utf8', 'en_GB.utf8'));
 

homm

Новичок
DiMA, ну вот пример url, с которым она не справляется:
/catalog/view/КС-45721/011/18.1/ОГМ 240-14 РИВП.18.004-14ТУ.html
Свой аналог — это запасной вариант, который буду использовать когда убежусь что решения нет :)

Gorynych, это все не работает, потому что это все юниксовые названия локалей.
 

Фанат

oncle terrible
Команда форума
а мне интереснее, что это за урл такой
и отчего бы его не сделать, скажем
/catalog/view/КС-45721/011/18.1/ОГМ 240-14 РИВП/18.004-14ТУ.html
а потом разбирать на части
 

dimagolov

Новичок
а зачем вообще применять parse_url к таким url-ам? В нем же ничего кроме path не наблюдается.
 

Активист

Активист
Команда форума
homm
Из-за Ajax'а (и т.п.) перешел полностью на UTF-8, многие стандартные функции приходится обходить через mb_* , писать аналоги и больше пользоваться регулярными выражениями.

У тебя выход один - парси URL самостоятельно, я использую для этого регулярки.
 

homm

Новичок
dimagolov, применяю функцию как раз не я, а фреймворк, анализирует его и выдает ссылку с учетом всех префиксов и настроек.

weregod, вы тоже на это напоролись и решения не нашли, или вы знаете причины? Было бы интересно их узнать.

Выяснил, что локаль «С» не приводит к искажениям русских utf-8 символов. Я так понимаю, это какая-то локаль по умолчанию, не учитывающая каких либо особенностей каких-либо языков и кодировок. К каким негативным последствием может привести, если я буду использовать эту локать?
 

fixxxer

К.О.
Партнер клуба
а в чем проблема с parse_url совместно с утф8?

все разделители в урлах с кодом символа <128 так что должно быть пофигу

еще можно парсить preg-ами с флагом /u
 

weregod

unserializer
homm,

> weregod, вы тоже на это напоролись и решения не нашли, или вы знаете причины? Было бы интересно их узнать

Причина в том, что под win пока такой локали нет. Решение не искал, так как было неактуально. Из неудобств отсутсвия локали могу заметить, что выхлоп конструкций вида date('%D') приходится перекодировать в utf8.
 

fixxxer

К.О.
Партнер клуба
Винда это вообще куча проблем, если не хочется держать linux/bsd в виртуалке, юзай хотя бы cygwin.
 
Сверху