Перейти к контенту

Инструкция по перекодированю форума в UTF-8


Рекомендуемые сообщения

IPB2ГЕА-8: HowTo

 

1. распаковываем из папки upload дистрибутива IPB в папку на сервере где будет лежать форум

2.переименовываем conf_global.php.dist в conf_global.php и выставляем права 777 для

install/installfiles

cache

cache/lang_cache

cache/skin_cache

uploads

style_images

conf_global.php

 

#!/bin/bash -x
# write by kudrin.alexandr@gmail.com by | sportbox.ru
# --- CONFIG SECTION ---

SDIR="/var/www/test.site.ru/data/forum"    # forum full dir without slash '/' in the end
MYSQLHOST="localhost"    									# MySQL Host
MYSQLUSER="root"    	 									# MYSQL user
MYSQLPASSWORD="12345"  									# Password of MySQL USER
MYSQLDB="lasttest" 			 									# Forum Database

# --- END CONFIG SECTION ---


# --- OPTIONAL CONFIG ---
SCP="windows-1251"        # codepage for 'iconv'
EXT=".*\.(htm[l]*|php[3]*|js|css|sql)$"    #files extensions for coding
FCS="windows-1251"    # charset for replace

# Destination Dir's params

DDIR=$SDIR"_utf/"    # with slash '/' in the end
MDIR=$SDIR"_utf_mb/" # with slash '/' in the end

DCP="UTF-8"        # codepage for 'iconv'
TCS="UTF-8"        # new charset

mkdir $DDIR
mkdir $MDIR

CDIR=$SDIR"_cp1251/"

mkdir $CDIR

SDIR=$SDIR"/"

echo > $SDIR


# --- END OPTIONAL CONFIG ---

# --- Files 2 utf8

   # Make new copy
   cp -aR $SDIR* $DDIR
   cp -aR $SDIR* $MDIR

   # Flush miscoded files
   find $DDIR -type f | grep -E "$EXT" | xargs -i rm -f {}

   # Convert From To
   find $SDIR -type f | grep -E "$EXT" | sed "s#$SDIR##" | xargs -i echo {} | \
   while read f
do
   	    iconv -c -f $SCP -t $DCP -o "$DDIR$f" "$SDIR$f"
   	    cat "$DDIR$f" | replace "unserialize" "mb_unserialize" > "$MDIR$f"


    # Revert MODE & OWNER
       chmod `find "$SDIR$f" -maxdepth 0 -printf "%m"` "$DDIR$f"
    chown `find "$SDIR$f" -maxdepth 0 -printf "%u:%g"` "$DDIR$f"

       # Replace strings
    perl -pi -e "s#content\s*\=\s*[\"'].*?charset\s*=\s*$FCS.*?[\"']#content=\"text/html; charset=$TCS\"#g" "$DDIR$f"

       done

 mv $SDIR* $CDIR
 mv $MDIR* $SDIR
 rm -dfr $MDIR

#MySQL 2  utf8
# Dump our DB
mysqldump --user=$MYSQLUSER --password=$MYSQLPASSWORD  $MYSQLDB --allow-keywords --create-options --complete-insert --default-character-set=cp1251 --add-drop-table > dump_$MYSQLDB.sql

# Convert dump file
iconv -f cp1251 -t UTF-8 dump_$MYSQLDB.sql > dump_$MYSQLDB"_utf8.sql"

# Replace all cp1251
cat dump_bdname_utf8.sql | replace "cp1251" "utf8" > dump_$MYSQLDB"_utf8_replace.sql"

# Drop our DB
yes | mysqladmin --user=$MYSQLUSER --password=$MYSQLPASSWORD drop $MYSQLDB

# Create DB and _bak
mysqladmin --user=$MYSQLUSER --password=$MYSQLPASSWORD create $MYSQLDB"_bak"
mysqladmin --user=$MYSQLUSER --password=$MYSQLPASSWORD create $MYSQLDB

# SEt default codepage
mysql --user=$MYSQLUSER --password=$MYSQLPASSWORD --execute="USE $MYSQLDB"_bak"; ALTER DATABASE $MYSQLDB"_bak" DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci"
mysql --user=$MYSQLUSER --password=$MYSQLPASSWORD --execute="USE $MYSQLDB; ALTER DATABASE $MYSQLDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci"

mysql --user $MYSQLUSER --password=$MYSQLPASSWORD $MYSQLDB --default-character-set=utf8 < dump_$MYSQLDB"_utf8_replace.sql"
mysql --user $MYSQLUSER --password=$MYSQLPASSWORD $MYSQLDB"_bak" --default-character-set=cp1251 < dump_$MYSQLDB.sql

 

Что он делает?

архивирует ваш форум в папку SDIR_сp1251

переводит все файлы в кодировку UTF-8 и сохраняет все это добро в папке SDIR_utf

в первоначальной папке SDIR оказывается форум в utf 8 во всех файлах функция unserialize заменена на mb_unserialize

берет вашу БД делает дамп в файл dump_MYSQLBD.sql

берет вашу перегоняет дамп в кодировку UTF файл dump_MYSQLBD_utf.sql

заменяет все DEFAULT CHARSET с cp1251 на utf-8 и сохрает результат в файл dump_MYSQLBD_utf_replace.sql

дамп с dump_MYSQLBD_utf_replace.sql импортирует в MYSQLBD

дамп с dump_MYSQLBD.sql импортирует в MYSQLBD_bak

 

5.открываем /forum/sources/ipsclass.php и в самое начало добавляем функцию

/взята с http://ru2.php.net/unserialize написанна skinnepa at hotmail dot com/

function mb_unserialize($serial_str) 
{
    $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
    return unserialize($out);    
}

 

6.в config_global.php выставить $INFO['mysql_codepage'] = 'utf8';

7.теперь переключаем ваш кодировку для отображения в вашем браузере UTF-8 и заходим в админку НАСТРОЙКИ -> общие настройки -> Кодировка документов -> UTF-8. Сохраняем собственно все.

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...

Таки этого оказалось не достаточно, опять таки потомучто УТФ будет полдноценно поддерживаться ПЫХой только с 6ой версии, а пока приходится извращатся. Не корректно работает preg_match, опять заменяем все одноименные функции

find /var/www/sitename/data/forum -name "*.php" | xargs perl -pi -e 's/preg_replace\(/mb_preg_replace\(/g'

 

после чего в файле ipclass добавляем перед функцией mb_unserialize, следующий код:

function mb_preg_replace  ($pattern , $replacement , $subject)
		{
			return preg_replace($pattern."u",$replacement, $subject);
		}

 

при этом в функции mb_unserialize, используем просто preg_replace(), без mb.

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...
Спасибо за подробную инструкцию, но как ваш скрипт запустить под Виндовс? (на локальной машине)

 

Как вариант поставить VM ware. )))

 

Смысл данного скрипта прост, берем все файлы php, html, xml и перекодируем из ср-1251 в утф 8. Чем это лучше сделать под виндой подсказать не могу. Потом находим все файлы в которых используется, фунции preg_exp и unserilze и заменяем их на mb_preg_exp и unserilize.

 

Деламем дамп БД, можно через пхп май админ, и мучаем этот дамп пока он не будет нормально показываться в утф-8. Потом заменяем в нем все вхождения ср1251 на утф8. И разворачиваем.

 

ЗЫ возможно при разорачивании дампа нужно указать параметр --default-charset=utf8

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...
Таки этого оказалось не достаточно, опять таки потомучто УТФ будет полдноценно поддерживаться ПЫХой только с 6ой версии, а пока приходится извращатся. Не корректно работает preg_match, опять заменяем все одноименные функции

find /var/www/sitename/data/forum -name "*.php" | xargs perl -pi -e 's/preg_replace\(/mb_preg_replace\(/g'

 

после чего в файле ipclass добавляем перед функцией mb_unserialize, следующий код:

function mb_preg_replace  ($pattern , $replacement , $subject)
		{
			return preg_replace($pattern."u",$replacement, $subject);
		}

 

при этом в функции mb_unserialize, используем просто preg_replace(), без mb.

После этого "патча" при добавлении в друзья пишет:

 

Warning: preg_replace() [function.preg-replace]: Compilation failed: invalid UTF-8 string at offset 17 in /opt/www/ipb/forum/sources/ipsclass.php on line 76

Warning: preg_replace() [function.preg-replace]: Compilation failed: invalid UTF-8 string at offset 17 in /opt/www/ipb/forum/sources/ipsclass.php on line 76

 

но при этом в друзья всё равно добавляет.

 

а полнотекстовый поиск так и не заработал. :D

Ссылка на комментарий
Поделиться на других сайтах

Не помню где брал, неплохой набор пхп-функций для перекодировки на лету.

Функции можно добавить например в сипекс-дампер...

unicode.lib.zip

Ссылка на комментарий
Поделиться на других сайтах

  • 5 месяцев спустя...

подскажите плз как правильно выполнить 4 пункт

как и куда поместить данный скрипт и как его вызвать ?

 

версия ipb 2.3.6

база уже в utf 8

если добавить кеш русскоо языка в win 1252 а в админке поставить utf-8 - все отображается корректно, но в бд крякозябрики

необходимо чтобы в бд был читаемый текст в utf-8

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...
блин, я чето пытался, так и не понял...

 

выложите плиз уже готовую версию в utf-8. просто не хочу vbulletin пользоваться. нравица IPB

Вы не соответствуете своему нику. Или наоборот, слишком сильно?

Надейтесь :D

Ссылка на комментарий
Поделиться на других сайтах

  • 11 месяцев спустя...

ни у кого не возникло проблем после конвертации с javascript?

У меня стоял тег spoiler и после конвертации при нажатии на тег, редиректит следующим образом:

"The requested URL /forum/\"java script:void(0);\" was not found on this server."

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...
Все так сложно? :blink:
Ссылка на комментарий
Поделиться на других сайтах

Гесер! Вам не нужно перекодировать свой форум в UTF-8, он уже хранится в этом виде. У Вас ведь тот же хостинг, что у меня был? Так вот, Вам нужно всего лишь, как написано в инструкции по обновлению:

2. Вы сконвертировали базу, которая уже была в UTF.

Начните обновление с шага 2, но не выполняйте перекодирование базы (самого текста), а только выполните замены команд SQL.

 

т.е.

Итак весь текст у нас переведен в UTF-8, теперь необходимо изменить команды SQL. Делается это так

 

Собственно так как дамп у нас должен быть в правильной cp1251 кодировке, то делаем замену в файле этих значений на новые:

 

> sed 's/SET NAMES cp1251/SET NAMES utf8/g' < dump.utf8 > 1.dump.utf8

> sed 's/DEFAULT CHARSET=cp1251/DEFAULT CHARSET=utf8/g' < 1.dump.utf8 > dump.utf8.sql

 

Данную команду наглядно описать с русскими значениями:

 

sed 's/БЫЛО/СТАЛО/g' < ОТКУДА ЧИТАЕМ > КУДА ЗАПИСЫВАЕМ

 

Я верно понял, что Вы собираетесь перейти на тройку?

Изменено пользователем pvo1988
Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.