Задать вопрос
@ua30

Как переписать PHP движок с Windows-1251 на UTF-8?

Добрый день!

Есть немаленький, старый движок. Чистый код весит около 3 Мб. Около полугода назад успешно перенес его с PHP 5.3 на версию 7.1 - документации по этому делу много. Изучил рекомендации 4-5 хороших статей. И то была пара моментов, которые не были там описаны. В принципе, все прошло достаточно гладко.

Теперь стоит другая задача. Движок настолько старый, что работает с кодировкой Windows-1251. Нужно переделать все под UTF-8. Сколько не искал - ничего толкового из советов не нашел. Большинство хорошей инфы идет из-за бугра, а для них Win-1251 не актуальна. :)

По сути единственное, что опишут - это заменить все функции работы со строками на их "mb_" аналоги. Я так понимаю, речь идет об этом списке аналогов: php.net/manual/ru/ref.mbstring.php ?

Насколько я понимаю, по части PHP нужно будет еще как минимум задать нужную кодировку в конфиге. Перекодировать сами PHP файлы в UTF-8. БД - то уже отдельные пляски. Еще из нюансов - на сайте есть AJAX, с перекодировкой результатов (т.к. такие запросы, если не ошибаюсь, отправляются только в UTF-8).

Все, этого достаточно? Что еще может быть, у кого есть опыт в подобном деле? И самое главное - нельзя ли просто в настройках PHP указать что "работаем с UTF-8" и точка. Чтобы не менять все функции?

Да и по самим функциям непоняточки. Например, есть preg_replace, но нет mb_preg_replace. Хотя в то же время есть и ereg_replace, и в то же время mb_ereg_replace. Хоть ereg_replace уже устаревшая / удаленная (в зависимости от версии PHP) функция. Как это понимать?

Запутался в конец.

2019.03.07 обновляю: узнал за эти дни много нового и интересного. :) думаю, многие очень поверхностно относятся к пониманию кодировок. Не знаю, актуальна ли тема на 2019 год. Но если что, в принципе, после всего этого могу сделать большой чек-лист что и как надо делать. Третий день переделываю движок под UTF-8. Реально исправлять код действительно не во многих местах надо. Но точек проверок очень много.

А теперь маленький вопрос-уточнение к знающим людям. Везде про preg_* функции пишут в стиле "используйте модификатор u чтобы работать с юникодом". А когда он реально необходим? По моим наблюдениям, функциям все равно со строками в каких кодировках работать. В PHP отношение ко строкам как к набору байт, а не символов. И походу модификатор u необходимо использовать только когда само регулярное выражение содержит символы за пределами US-ASCII. В противном случае любые UTF-8 строки корректно обрабатываются без модификатора u. Что скажите?
  • Вопрос задан
  • 604 просмотра
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ответы на вопрос 2
php666
@php666
PHP-макака
Я так понимаю, речь идет об этом списке аналогов: php.net/manual/ru/ref.mbstring.php ?
Да. Плюс, возможно, придется искать еще и самописные аналоги, которых еще нет в самом php. Я когда свой двиг переписывал, то мне понадобилось лишь 3 функции-аналога найти.

Насколько я понимаю, по части PHP нужно будет еще как минимум задать нужную кодировку в конфиге.
У меня в htaccess вот это:
# Кодировки
php_value mbstring.language "Russian"
php_value mbstring.internal_encoding "UTF-8"
php_value default_charset utf-8

AddDefaultCharset utf-8


БД - то уже отдельные пляски
Конвертируем и при подключении к базе задаем mysqli->set_charset('utf8').

Еще из нюансов - на сайте есть AJAX, с перекодировкой результатов
да, убрать перекодировку, оставить лишь заголовок 'application/json; charset=utf-8' и сделать просто json_encode.

Например, есть preg_replace, но нет mb_preg_replace.
там есть модификатор /u

Вот статья - https://webonrails.ru/post/143646653415428599/
Ответ написан
@metajiji
Если в рнр файлах есть русские символы - нужно перекодировать из в утф, если есть темплейты, данные в базе, в js файлах и вообще во всех файлах движка - iconv -f 1251 -t utf8 для них. С базой dump/iconv/sed/restore. Дальше больше, настройки веб сервера, чтобы не только meta с кодировкой, которую в шаблонах поправили но ещё и веб сервер(если настроено) отдавал в утф.

Не понимаю причем тут mb_*, тут в другом дело же.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы