RSS-подписка

RSS-лента

Новые статьи

Последние комментарии


Получать обновления на эл. почту

Ваш e-mail:

Рассылка новостей от Loco

Смена кодировки Битрикса с windows-1251 в UTF-8 (utf8)

Смена кодировки Битрикса с windows-1251 в UTF-8 (utf8) Почему-то Битрикс продолжает разрабатываться на кодировке windows-1251, хотя для seo рекомендуется UTF-8.

Случилось мне повозиться над сменой кодировки проекта на Битриксе с windows-1251 (cp1251) на UTF-8 (utf-8). Расскажу как всё прошло.

1. Резервные копии файлов и БД

Сначала сделать все резервные копии: файлов сайта и базы данных, чтобы откатиться, если что-то пойдёт не так. У меня "не так" пошло :) и да резервные копии очень пригодились. Никогда не знаешь, чего ждать от битрикса.

2. php.ini и .htaccess

Попросить техподдержку вашего хостинга прописать в php.ini следующие строки (на REG.RU вы можете сами это сделать в папке php-bin/php.ini)

mbstring.func_overload=2
mbstring.internal_encoding=utf-8

В файл /.htaccess добавить строки:

php_value mbstring.func_overload 2 
php_value mbstring.internal_encoding UTF-8 

3. Удалить модули поиска и веб-аналитики

Удалите модули "Поиск" без сохранения таблиц и "Веб-аналитика" (без сохранения таблиц, но с сохранением шаблонов сообщений).

4. Удалить букву ё

Удалить из словаря транслита в модуле "Форум" (Сервисы > Форумы > Фильтр нецензурных слов > Словарь транслита) букву 'ё', которая имеет ID = 7.

5. Перекодировать всю базу данных в UTF-8

Сменить кодировку базы данных, типов полей с cp1251 на utf8: это можно делать на сервере или локально. Я делал локально, потом импортировал базу уже исправленную в кодировку utf8. Здесь в помощь команда

SELECT CONCAT('ALTER   TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as
sqlcode
FROM `information_schema`.`TABLES` t
WHERE 1
AND t.`TABLE_SCHEMA` = 'database_name' ORDER BY 1

где database_name - имя вашей база данных.

Этот запрос выведет на страницу новый запрос, который нужно будет выполнить на этой же странице.

Копируйте все строки нового запроса (выбрав выводить все запросы на одной странице) и выполните полученный новый запрос. По завершении выполнения все таблицы базы будут переведены в кодировку UTF-8.

Проверить и посмотреть какая кодировка у таблиц в БД можно через phpmyadmin, выполнив SQL

SHOW VARIABLES LIKE 'char%';

и

SHOW VARIABLES LIKE 'collation%'

а поменять, если где-то увидите latin1 можно командой

set collation_server = 'utf8_general_ci';

6. after_connect

Пропишите в /bitrix/php_interface/after_connect.php

$DB->Query("SET NAMES 'utf8'");
$DB->Query('SET collation_connection = "utf8_unicode_ci"');

Пропишите в /bitrix/php_interface/after_connect_d7.php:

$connection->queryExecute("SET NAMES 'utf8'");
$connection->queryExecute('SET collation_connection = "utf8_unicode_ci"'); 

7. Пропишите в /bitrix/.settings.php:

return array (
  'utf_mode' => 
  array (
    'value' => true,
    'readonly' => true,
  ),

8. Сходите на турники сделайте подтягивания

9. Рекурсивная смена кодировки файлов в папке и вложенных папках с windows-1251 в UTF-8 (utf8).

Можно вручную в среде разработки, а можно скриптом по ssh. Создаем файл iconv.sh с содержимым:

# !/bin/sh
find $1 -type f -name '*.'$2 -o -name '*.'$2 | while read i
    do
    echo $i
    iconv -f cp1251 -t utf8 -o "$i.new" "$i" &&
    mv -f "$i.new" "$i"
    done

Тут может возникнуть дальше ошибка, если вы создали файл в Windows. Может такая ошибка выдаться при попытке запустить скрипт уже на сервере:

sh done syntax error unexpected token 'done'

или такая

line 8: syntax error: unexpected end of file

Надо просто убрать лишние невидимые символы <CR>, которые добавил windows в ваш файл.

Наберите od -a test.sh, чтобы увидеть эти символы невидимые.

$ od -a test.sh
0000000    #   !   /   b   i   n   /   b   a   s   h  cr  nl   #  sp  cr
0000020   nl   w   h   i   l   e  sp   :  cr  nl   d   o  cr  nl  sp  sp
0000040   sp  sp   e   c   h   o  sp   "   P   r   e   s   s  sp   [   C
0000060    T   R   L   +   C   ]  sp   t   o  sp   s   t   o   p   "  cr
0000100   nl  sp  sp  sp  sp   s   l   e   e   p  sp   1  cr  nl   d   o
0000120    n   e  cr  nl                                                
0000124

Из-за них файл не исполняется, вот как windows подпортил наш файл sh. Можете выполнить команду  для вашего файла, которая очистит его.

$ dos2unix test.sh

Но если этой функции не установлено на сервере, то создайте файлик через консоль.

Открыть новый файл с именем iconv2.sh

nano -w iconv2.sh

Введите код, вручную напечатайте

# !/bin/sh
find $1 -type f -name '*.'$2 -o -name '*.'$2 | while read i
    do
    echo $i
    iconv -f cp1251 -t utf8 -o "$i.new" "$i" &&
    mv -f "$i.new" "$i"
    done

Для выхода и сохранения файла нажмите

CTRL+X потом Y и потом Enter

Сделайте файл исполняемым командой (Нужно дать этому файлу разрешение на выполнение как программы.)

chmod +x iconv2.sh

 

Далее через терминал запускаем наш скрипт

sh iconv2.sh folder js

sh – запускает сам скрипт
iconv.sh – название файла скрипта
folder – путь к той папке, файлы которой нам нужно перекодировать, этот путь может выглядеть так, например, ../server/project – перекодирует все файлы в  папке server/project, которая находиться в домашней директории юзера (пользователя системы)
js – расширение файлов, которые нужно переконвертировать.

10. dbconn

В файл /bitrix/php_interface/dbconn.php добавить строки:

define("BX_UTF", true); 

11. Админка Битрикса

В админке битрикса изменить в настройках языка ru кодировку с windows-1251 на utf-8

12. Очистить кеш сайта, выйти и войти в админку

13. Установить модуль поиска и сделать переиндексацию

Ну и всё.

 

Ссылки:

  • http://rushstudio.by/blog/development/smena-kodirovki-bitriks-na-utf8/
  • https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=2919
  • http://omelchuck.ru/nastrojka-mysql-dlya-raboty-s-utf8/
  • http://owb-rotor.ru/2012/04/zametki-na-polyax-rekursivno-perekodiruem-fajly-v-papke-i-vlozhennyx-papkax-s-kodirovki-windows-1251-v-utf-8-utf8/index.html
Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.