Начинаю новую тему. По особенностям и встреченным лично "граблям".
Начну с итоговых шагов алгоритма перевода своего сайта и БД из одной кодировки в другую (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.
Смотрим стартовые статьи на тему перевода сайта (а это сам код в РНР и БД) в новую кодировку.
переход на УТФ-8 имеет ряд граблей, о которых все в инете промолчали.... собрал сам
Итак, мой алгоритм:
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
Подробнее тут:
Я не заменял, но можно, т.к. аналог есть
mb_send_mail вместо mail
mb_ereg
У меня работает и без этого
ВАЖНО.
Все эти md_ методы НЕ РАБОТАЮТ, если ручками в каждом методе последним параметром не указать "UTF-8". Вот же весело... но есть панацея:
В начале всего кода написать
mb_internal_encoding("UTF-8");
Тогда для всех md_ методов будет по-умолчанию верная кодировка и кол-во отрезаемых\измеряемых букв будет верным.
Подробнее:
Вот без всего этого и особенно mb_internal_encoding я не мог залогинится под "ТестовыйЛогинДлинный" пороговые 20 букв на логин.
4. Вроде все и на локале все работает - заливаем на хостинг. Открываем браузер (любой - Опера, ИЕ, Фокс) - и там ГЛЮКИ. Кодировка по умолчанию не распознается (во всех)!!
Если руками ставить - все ок, но это же не нормально, всем не объяснить, кто-то просто уйдет не поняв.
Нужно в корне сайта положить файл
.htaccess
в нем
AddDefaultCharset utf-8
Взята инфа из:
И вот тогда, о чудо, вроде все
5. Но и это не все
В первых статьях, что дал в начале, советуют в коде писать
setlocale(LC_ALL, 'ru_RU.UTF-8', 'Russian_Russia.65001', 'UTF-8');
А после этого перестает работать БД нормально, т.к. в нее пишется не 33.50, а 33,50 что для компа не число вообще.
То есть региональные настройки ставятся, а для РФ они по умолчанию очень левые в понимании компа.
Вывод - не писать это или конвертить аккуратно циферьки, как в другой статье было.
Вот теперь все.
Если что еще отвалится, то алгоритм будет пополняться новыми "граблями"
Хелло!
То есть, изначально при создании сайта лучше испз. котировку - UTF-8!
А есть беспл. хосты - где дают возможность испл.PHP + MySQL?
Шаблоны?
P.s. жене сайт надо сделать, а я этим лет пять ужу не занимался. Хочется что-то забамбарить.
А погуглить? Первые три линка
Но тут нужен готовый проект. Даётся 21 день на обкатку движка на данном хостинге, потом в течении недели регают домен 2-го уровня в зоне .ru.
Какие ограничения? Никаких.
Что нужно? Работающий сайт + один рекламный банер, который вы сами ставите по тематике сайта, если у вас выкупят место, то можно и денюжку поиметь.
PS, не рекламирую, а только советую.
Наконец-то догадался погуглить и найти причину, почему на локале имена таблиц в БД мелкими буквами, а на сервере большими (или мелкими) -зависит от хостера.
Мне удобно, когда таблица названа "ShipTabe", а не "shiptable"
Когда у меня накопилось с похожими названием куча таблиц, я перестал быстро по ним фокусироваться и таки нашел, как лечить на локале.
Способа два
1. переназвать созданые в Мускле файлы с большими буквами
2. в my.ini добавить lower_case_table_names = 0 в секцию [mysqld]
Все созданные до того таблицы после п.2 все равно нужно переназывать по способу 1 или экспорт\импортом с редактированием .sql
Продолжим тему РНР познаний
Как ставить набор
Апач+РНР+Мускл на локал
лучше ставить для пробы на виртуальную машину (Virtual PC - беспл от МСа, весит 35мб)
Ставишь туда что хошь и не жалко снести, если запорется.
Но это путь для упертых. Излишне сложно.
Вместо установки РНР и т.д. по-отдельности, можно просто установить Денвер или XAMPP.
Там в комплекте идет Apache 2, PHP5, MyСКЛ 5, phpMyAdmin...
=====================
Статья по "Груше" (PEAR)
PEAR Для РНР это как MFC для С++
=====================
Про оптимизацию и FastCGI
======================
туториал по связи флаш и РНР
А вот про ХМЛ и обмен флаша с РНР
как на РНР писать флаш (то есть генерить самому)
Тема MySQL
Язык запросов велик и могуч - нужно читать доки (книжка рецептов SQL издат-ва O'Reilly рулит)
Например, там можно сделать в select свое поле вида
(case when a< 10 then 1 else 0) as aa
======
В МуСкл есть транзакции.
Но не на всех таблицах
как юзать в РНР в коментах ниже
На таблицах MyISAM - нет.
При этом есть веселость - на мастерхосте, например, нет ИнноДБ, но есть БДБ
А на локале в ХАМРР нет БДБ, но есть ИнноДБ
Но это лечится автозаменой по бакапу.
То есть для отладки и работы все ок.
=================
Джойны нескольких таблиц
Анализ и замеры NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL
=============
Забавность РНР
Если внутри одного файла сперва идет просто код, а потом описание класса, то все работает, даже если вызов класса идет выше, чем его описание.
А вот если этот класс отнаследован от другого, который добавляется через инклуд, то такая последовательность уже сбоит.
Но если перевести вызов после описания класса, то снова все ок.
===========
Во флаше можно делать константы из массива
public static const arNationShortName:Array = ["pir", "eng", "fra", "spa", "hol"];
а вот в РНР уже фига. Идет ругань
Но можно сделать переменную статик
static $arNationShortName = array("pir", "eng", "fra", "spa", "hol");
по сути будет та же константана
return Nation::$arNationShortName[$num];
Есть пакет Денвер, там апач+пыхпых+мускуль+перл и т.д. (http://www.denwer.ru/)
Хороший мануал по мускулю на самом сайте его есть, достаточно подробно с примерами.. В принципе синтаксис стандартный для SQL (ANSI SQL-92). Но есть некоторые нюансы. Поэтому читаем внимательно
Для работы с запросами у мускуля только команд шелл, поэтому повсеместно используются различные сторонние утилиты. Наиболее распространенная phpMyAdmin, вебморда на похапе. Но есть и другие. Обычно на форумах дается несколько ссылок.
Особенность отправки e-mail в кодеровке utf-8
нужно сабжект оборачивать в некую магическую конструкцию
$subject = "=?utf-8?B?" . base64_encode($subject) . "?=";
Когда мне довелось переводить базу Из UTF - 8 в православное CP 1251 я попусту использовал Notepad ++
Причём базы я открывал сразу тем суперблокнотом...... менял кодировку самого файла .sql и в параметрах самой базы прописывал то что он уже к другой кодировке принадлежит.....
И это у меня прокатило как дети в школу
думаю если использовать тот же метод то можно и наоборот базы сконвертировать....
PS оговорюсь сразу что химичил с базами движка DLE благодаря подсказке от Гугла и доподлинно мне не известно прокатит ли такой прикол на других движках....
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)