Seaward.ru

Здравствуйте, гость ( Вход | Регистрация )

> Разработка на PHP + MySQL, Токости, использование как сервера для flash игр
ALexusB
сообщение Jan 12 2011, 15:49
Сообщение #1


Разработчик игры К:ВЛ
*******

Seaward TeamЖелезный Профессор
Группа: Admin
Сообщений: 14,812
Регистрация: 2-November 04
Пользователь №: 3



Начинаю новую тему. По особенностям и встреченным лично "граблям".

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

Для чего вообще UTF8?
Ну, для начала - весь Flash на utf и иначе он русский не понимает. У меня исторически сложилось делать сайт на win-1251, т.к. изначально не нашел редактора с UTF и не понял почему по умолчанию кракозябры в браузере, хотя на локале все ок.
То есть приходилось обмен сервер-клиент делать через переводчик
mb_convert_encoding($str, "UTF-8", "cp1251") в обе стороны. Благо именно текста передавалось мало, больше ключевых параметров, а текст грузился во Flash из xml, который в UTF изначально.

Опять же с БД было все проще, т.к. в UTF каждая буква записана 2 байтами. А это накладывает свои сложности, как на длину строк, так и на размер БД.
При этом чисто визуально (если хек-едитором смотреть) английские буквы пишутся, как обычно 1 буквой. То есть нет какого, что все буквы по 2 байта - некоторые 1.

Смотрим стартовые статьи на тему перевода сайта (а это сам код в РНР и БД) в новую кодировку.
http://habrahabr.ru/blogs/php/29020/
http://anton-pribora.ru/articles/xml/xml-xslt-utf8/
http://svdev.ru/blog/site-convert-from-cp1251-to-utf8/

переход на УТФ-8 имеет ряд граблей, о которых все в инете промолчали.... собрал сам sad.gif
Итак, мой алгоритм:
1 База конвертится выгрузкой в .sql бэкапа, гроханьем таблиц (а лучше и БД, чтоб кодировка была у нее другая) и закачкой обратно с заменой cp1251 на utf8 в нотпаде
Это все просто и не нужно утилит никаких. Но возможно, если БД маленькая и замена может быть в текстовом редакторе. Иначе - утилиты. Выше описано как штатно или своим скриптом перегонять.

2. код РНР и ХТМЛ конвертится утилитами, потом руками все фразы windows-1251 заменить на utf-8 - это просто, поиском по коду.
Собственно, тут я нашел ответ, почему изначально не смог на UTF делать - у меня редакторы лепили лишние байты в начало файла, а для PHP это критично.

3. Но это не все!!! наступает жопа работы со строками. Сразу перестают работать логины и пароли на русском, все режется, так как длина строк другая.
Кстати, хоть UTF - это 2 байта на букву, но в поле БД varchar(20) влазит не 10 букв UTF, а таки 20, то есть оно само на уровне БД занимает больше. И за это спасибо! Хоть тут не нужно все строки в х2 увеличивать ручками.

А теперь дайджест чего отвалится и нужно заменять по коду на другие методы (поиском по методу без mb_ и дописыванием аналога)
mb_strrchr
mb_strpos
mb_strlen
mb_substr
mb_strlower

В регулярных выражениям (preg_match и прочих) перестанут работать русские буквы, нужно заканчивать регулярное выражение /u
Подробнее тут:
http://forum.codenet.ru/archive/index.php/t-46799.html
http://forum.ixbt.com/topic.cgi?id=24:40663

Я не заменял, но можно, т.к. аналог есть
mb_send_mail вместо mail
mb_ereg

У меня работает и без этого

ВАЖНО.
Все эти md_ методы НЕ РАБОТАЮТ, если ручками в каждом методе последним параметром не указать "UTF-8". Вот же весело... но есть панацея:
В начале всего кода написать
mb_internal_encoding("UTF-8");
Тогда для всех md_ методов будет по-умолчанию верная кодировка и кол-во отрезаемых\измеряемых букв будет верным.
Подробнее:
http://ru2.php.net/manual/en/function.mb-i...al-encoding.php

Вот без всего этого и особенно mb_internal_encoding я не мог залогинится под "ТестовыйЛогинДлинный" пороговые 20 букв на логин.

4. Вроде все и на локале все работает - заливаем на хостинг. Открываем браузер (любой - Опера, ИЕ, Фокс) - и там ГЛЮКИ. Кодировка по умолчанию не распознается (во всех)!!
Если руками ставить - все ок, но это же не нормально, всем не объяснить, кто-то просто уйдет не поняв.

Нужно в корне сайта положить файл
.htaccess
в нем
AddDefaultCharset utf-8

Взята инфа из:
http://forum.nic.ru/showthread.php?t=224
http://joomlaforum.ru/index.php?topic=43421.0

И вот тогда, о чудо, вроде все

5. Но и это не все smile.gif
В первых статьях, что дал в начале, советуют в коде писать
setlocale(LC_ALL, 'ru_RU.UTF-8', 'Russian_Russia.65001', 'UTF-8');

А после этого перестает работать БД нормально, т.к. в нее пишется не 33.50, а 33,50 что для компа не число вообще.
То есть региональные настройки ставятся, а для РФ они по умолчанию очень левые в понимании компа.
Вывод - не писать это или конвертить аккуратно циферьки, как в другой статье было.

Вот теперь все.
http://online.seaward.ru/ переведен на UTF-8
Если что еще отвалится, то алгоритм будет пополняться новыми "граблями" wink.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
zorx007
сообщение Sep 5 2011, 17:07
Сообщение #2


боцман
****


Группа: форумчанин
Сообщений: 177
Регистрация: 23-June 07
Из: Сахалин
Пользователь №: 10,891



Когда мне довелось переводить базу Из UTF - 8 в православное CP 1251 я попусту использовал Notepad ++
smile.gif Причём базы я открывал сразу тем суперблокнотом...... менял кодировку самого файла .sql и в параметрах самой базы прописывал то что он уже к другой кодировке принадлежит.....

И это у меня прокатило как дети в школу smile.gif

думаю если использовать тот же метод то можно и наоборот базы сконвертировать....

PS оговорюсь сразу что химичил с базами движка DLE благодаря подсказке от Гугла smile.gif и доподлинно мне не известно прокатит ли такой прикол на других движках....
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 17th December 2018 - 05:31
Яндекс цитирования Rambler's Top100
Rambler's Top100