Перейти к публикации

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

Поскольку разработчик выпускает релизы только в кодировке win-1251 многим приходится конвертировать дистриб в utf-8 вруную. Вместе с тем, я не смог найти инструкции как это сделать должным образом, поэтому пришлось все делать с нуля. Но, как оказалось, это не так сложно. Ниже публикую алгоритм как это делал я.

Для работы нужно иметь программу-перекодировщик. Я использовал Kaboom, потому что в ней есть поддержка всех кодировок и функция пакетной конвертации. Скачать можно тут: http://www.sisulizer.com/kaboom/

0. Запускаем Kaboom и переходим на вкладку Multi-converter. Вытсавляем там кодировку (win-1251 -> utf-8), убераем птичку Write BOM, ставим Cnahge content-type, ставим Overwrite Source.

1. Скопировать из дистрибутива папку Upload куда-нибудь подальше от оригинала :)

3. Зайти в эту папку проводником, нажать F3 и сделать поиск задав в строке запроса "*" (без кавычек).

Таким образом выведутся все файлы из этой папки.

4. Выделить из полученного списка все файлы кроме картинок и папок (их перекодировать не нужно) и драг-н-дропом перенести в окно Kaboom.

5. Нажимаем Convert, жмем в открывшемся сообщении кнопку OK и ждем окончания процесса конвертации.

На этом перекодирование дистрибутива завершено, но нужно еще сделать некоторые изменения в содержмом файлов..

1. Внести изменения в meta-тэги conten-type некоторых файлов шаблонов. Для этого понадобиться программа автозамены. Я использую Search and Replace (http://www.funduc.com/).

Строка для поиска: charset=windows-1251

Заменять на: charset=utf-8

Не забудтье убедиться что замена производится во всех вложенный папках!

Для следующих шагов портебуется текстовой редактор с поддеркой UTF-8 (например Editplus).

2. Изменить в файле install.php

строку

$config['charset'] = "windows-1251";
на
$config['charset'] = "utf-8";
3. В языковых файлах adminpanel.lng и website.lng заменить
'charset'			=>	"windows-1251",
на
'charset'			=>	"utf-8",

4. Заменить стандартную функцию транслитерацию, на адаптированную под юникод (это нужно чтобы статьи с русскими названиями получали адекватны ЧПУ).

Для этого в файлах

/engine/inc/functions.inc.php и /engine/modules/functions.php

Заменить стандартную функцию транслитерации

  Цитата
function totranslit($var)

{

...

}

на

  Цитата
function totranslit($var)

{

$converter = array(

'а' => 'a', 'б' => 'b', 'в' => 'v',

'г' => 'g', 'д' => 'd', 'е' => 'e',

'ё' => 'e', 'ж' => 'zh', 'з' => 'z',

'и' => 'i', 'й' => 'y', 'к' => 'k',

'л' => 'l', 'м' => 'm', 'н' => 'n',

'о' => 'o', 'п' => 'p', 'р' => 'r',

'с' => 's', 'т' => 't', 'у' => 'u',

'ф' => 'f', 'х' => 'h', 'ц' => 'c',

'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch',

'ь' => '\'', 'ы' => 'y', 'ъ' => '',

'э' => 'e', 'ю' => 'yu', 'я' => 'ya',

'А' => 'A', 'Б' => 'B', 'В' => 'V',

'Г' => 'G', 'Д' => 'D', 'Е' => 'E',

'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z',

'И' => 'I', 'Й' => 'Y', 'К' => 'K',

'Л' => 'L', 'М' => 'M', 'Н' => 'N',

'О' => 'O', 'П' => 'P', 'Р' => 'R',

'С' => 'S', 'Т' => 'T', 'У' => 'U',

'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',

'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch',

'Ь' => '\'', 'Ы' => 'Y', 'Ъ' => '',

'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',

);

$var = str_replace(".php", "", $var);

$var = trim(strip_tags($var));

$var = preg_replace( "/\s+/ms", "-", $var );

$var = strtr($var, $converter);

$var = preg_replace("/[^a-z0-9\_\-.]+/mi", "", $var);

$var=preg_replace('#[\-]+#i', '-', $var);

$var = strtolower ( $var );

if (strlen($var) > 50) {

$var = substr ($var, 0, 50);

if (($temp_max = strrpos($var, '-'))) $var = substr ($var, 0, $temp_max);

}

return $var;

}

После проделывания вышеописанных действий, можно заливать файлы на сервер и запускать установку. В процессе установки не забудьте указать кодирку utf-8 для баз!

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

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

Спасибо.

А как насчет данной функци???

function convert_unicode($t, $to = 'windows-1251')

{

	$to = strtolower($to);

	if ($to == 'utf-8') {

	  $t = preg_replace( '#%u([0-9A-F]{1,4})#ie', "decode_to_utf8(hexdec('\\1'))", utf8_encode($t) );

	  $t = urldecode ($t);

	} else {

	  $t = preg_replace( '#%u([0-9A-F]{1,4})#ie', "'&#' . hexdec('\\1') . ';'", $t );

	  $t = urldecode ($t);

		$t = @html_entity_decode($t, ENT_NOQUOTES, $to);

	}

	return $t;

}

Может есть смысл сделать ей значение по умолчанию не windows-1251 а utf-8 ?

Не пинайте, я не программист.

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

Eagle, а фиг знает - пробыват ьнадо. Мне думается эта функция вообще не нужна - достаточно будет iconv

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

у меня такой вопрос что существенного дает кодировка utf, просто щас делаю сайт, и думаю менять все на utf или нет, что вообще эта фича дает для русскоязычного сайта?

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

  spam писал:
что вообще эта фича дает для русскоязычного сайта?

абсолютно ничего. UTF-8 нужна чтобы одновременно писать на сайте например на русском и китайском. при UTF-8 иероглифы и кирилица на одной странице будет отображатся корректно.

  Eagle писал:
А как насчет данной функци???

значения по умолчанию это значения по умолчанию, и не используются если есть другие значения. Например если кодировку не указать в настройках то применится значение по умолчанию, если указать, то от значения ни холодно ни жарко

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

  Цитата
А как насчет данной функци???

Незнаю что делает данная функция, но раз все работает ОК, то я бы не стал ее трогать. Зачем?

Что касается кодировки UTF-8 - IMHO рано или поздно на нее прийдется переходить, поэтому если есть возможность то лучше это сделать сразу, чтобы потом не иметь проблем с конвертацией.

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

Greeze,

это HTML Они занимают больше памяти в 8 раз, хотя для короткого текста никаких проблем.

  Dialer писал:
Что касается кодировки UTF-8 - IMHO рано или поздно на нее прийдется переходить, поэтому если есть возможность то лучше это сделать сразу, чтобы потом не иметь проблем с конвертацией.

С чего вдруг? UTF-8 не является какой то новой новомодной кодировкой, существует для определенных целей. И переходит на нее рано или поздно не нужно

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

  celsoft писал:
Например если кодировку не указать в настройках

Теперь ясно откуда в функцию значеня берутся. Спасибо.

Ссылка на сообщение
Поделиться на других сайтах
  • 3 месяца спустя...

Вот еще чего интересно, в файле install.php есть строка

'charset' => "windows-1251",

Нужно ли и тут ставить utf-8 ?

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

freeswap,

это кодировка которая установится в настройки скрипта.

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

Хм, вчера менять не стал, оставил по-дефолту, но в скрипте после установки utf-8 :D

И еще почему то никто не скажет что нужно добавить в .htaccess

AddDefaultCharset utf-8

To celsoft

Может быть вы переведете дистрибутив на utf-8 по науке и сделаете доступным для скачивания, так же как сверсию cp1251?

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

Если считать что, русский язык - единственный на свете, то UTF и нафиг не нужен, но стоит попробовать использовать любой другой язык (не обязательно китайский), имеющий буквы типа á é í ñ ä, то сразу получаешь то, что эти буквы пропадают при записи данных в базу, особенно прикольно когда человек их в логине использует, а потом зайти не может.

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

Есть небольшая проблема. Скрипт переконвертировал, но в нескольких местах, некоректноая кодировка. Почти везде где идет сокращение с многоточием, такая беда.

fb40d0bae1d505a61cc7534ad4ecb443.jpg

У кого какие мысли?

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

  Цитата
У кого какие мысли?

Я встречался с этим. Это изза того, что кодировка УТФ8. Где 1 символ - 2 байта. Т.о. у вас в конце строки какбфы полусимвол.

Решается просто:

в .htaccess в самый верх добавить

php_value mbstring.func_overload 6

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

Спасибо за участие, но это не решило проблему. В гугле казалось бы много инфы на эту тему, но так и не нашел ответа.

P.S. Это встречается в 3- местах. При редактировании новостей, когда мы видим весь список, тут, как показано на скрине и еще если нажать на "проверить обновления", то приходит строка такими вот вопросиками и на конце строки 7.2.

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

  Цитата
заменить substr на mb_substr

Это в каком файле заменить ? Или везде, во всех файлах?

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

  Цитата
Спасибо за участие, но это не решило проблему.

mbstring то добавь в php.ini ))

Эта библиотека автоматом заменит substr на mb_substr

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

Проблема остается в силе, добавил на локалке, все так же и осталось.

В любом случае хостер вряд ли согласится менять что то в php.ini...

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

  Цитата
В любом случае хостер вряд ли согласится менять что то в php.ini...

Однако... Для работы с юникодом нужен модуль mbstring. Попроси включить её.

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

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

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

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

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

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

×
×
  • Создать...