![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
ALexusB |
![]()
Сообщение
#1
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,550 Регистрация: 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. Смотрим стартовые статьи на тему перевода сайта (а это сам код в РНР и БД) в новую кодировку. переход на УТФ-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 что для компа не число вообще. То есть региональные настройки ставятся, а для РФ они по умолчанию очень левые в понимании компа. Вывод - не писать это или конвертить аккуратно циферьки, как в другой статье было. Вот теперь все. Если что еще отвалится, то алгоритм будет пополняться новыми "граблями" ![]() |
![]() ![]() |
InkyFreeman |
![]()
Сообщение
#2
|
Символ Пиратизма ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 1,331 Регистрация: 27-September 05 Пользователь №: 1,270 ![]() |
Хелло!
То есть, изначально при создании сайта лучше испз. котировку - UTF-8! А есть беспл. хосты - где дают возможность испл.PHP + MySQL? Шаблоны? P.s. жене сайт надо сделать, а я этим лет пять ужу не занимался. Хочется что-то забамбарить. Сообщение отредактировал InkyFreeman - Jan 14 2011, 13:26 |
ALexusB |
![]()
Сообщение
#3
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,550 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
А погуглить? Первые три линка
|
Blood5 |
![]()
Сообщение
#4
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 229 Регистрация: 1-November 08 Из: Россия, город Пенза Пользователь №: 18,258 ![]() |
Но тут нужен готовый проект. Даётся 21 день на обкатку движка на данном хостинге, потом в течении недели регают домен 2-го уровня в зоне .ru. Какие ограничения? Никаких. Что нужно? Работающий сайт + один рекламный банер, который вы сами ставите по тематике сайта, если у вас выкупят место, то можно и денюжку поиметь. ![]() PS, не рекламирую, а только советую. ![]() |
ALexusB |
![]()
Сообщение
#5
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,550 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Наконец-то догадался погуглить и найти причину, почему на локале имена таблиц в БД мелкими буквами, а на сервере большими (или мелкими) -зависит от хостера.
Мне удобно, когда таблица названа "ShipTabe", а не "shiptable" Когда у меня накопилось с похожими названием куча таблиц, я перестал быстро по ним фокусироваться и таки нашел, как лечить на локале. Способа два 1. переназвать созданые в Мускле файлы с большими буквами 2. в my.ini добавить lower_case_table_names = 0 в секцию [mysqld] Все созданные до того таблицы после п.2 все равно нужно переназывать по способу 1 или экспорт\импортом с редактированием .sql |
ALexusB |
![]()
Сообщение
#6
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,550 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Продолжим тему РНР познаний
Как ставить набор Апач+РНР+Мускл на локал лучше ставить для пробы на виртуальную машину (Virtual PC - беспл от МСа, весит 35мб) Ставишь туда что хошь и не жалко снести, если запорется. Но это путь для упертых. Излишне сложно. Вместо установки РНР и т.д. по-отдельности, можно просто установить Денвер или XAMPP. Там в комплекте идет Apache 2, PHP5, MyСКЛ 5, phpMyAdmin... ===================== Статья по "Груше" (PEAR) PEAR Для РНР это как MFC для С++ ===================== Про оптимизацию и FastCGI ====================== туториал по связи флаш и РНР А вот про ХМЛ и обмен флаша с РНР как на РНР писать флаш (то есть генерить самому) |
Warship |
![]()
Сообщение
#7
|
Гроза морей ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: бета-тестер Сообщений: 441 Регистрация: 29-April 07 Из: Прим. край г. Находка Пользователь №: 9,103 ![]() |
Вместо установки РНР и т.д. по-отдельности, можно просто установить Денвер или XAMPP. Там в комплекте идет Apache 2, PHP5, MyСКЛ 5, phpMyAdmin... Есть еще такая штука: Удобно: накатил на флашку и пользуешься ![]() |
ALexusB |
![]()
Сообщение
#8
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,550 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Тема 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]; |
navy |
![]()
Сообщение
#9
|
Hagane no Renkinjutsushi ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Seaward.Ru Team Сообщений: 5,972 Регистрация: 15-March 05 Из: Волгоград Пользователь №: 578 ![]() |
Есть пакет Денвер, там апач+пыхпых+мускуль+перл и т.д. (http://www.denwer.ru/)
Хороший мануал по мускулю на самом сайте его есть, достаточно подробно с примерами.. В принципе синтаксис стандартный для SQL (ANSI SQL-92). Но есть некоторые нюансы. Поэтому читаем внимательно ![]() Для работы с запросами у мускуля только команд шелл, поэтому повсеместно используются различные сторонние утилиты. Наиболее распространенная phpMyAdmin, вебморда на похапе. Но есть и другие. Обычно на форумах дается несколько ссылок. Цитата (case when a< 10 then 1 else 0) as aa не забывем end в конце кейса ![]() |
ALexusB |
![]()
Сообщение
#10
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,550 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Особенность отправки e-mail в кодеровке utf-8
нужно сабжект оборачивать в некую магическую конструкцию $subject = "=?utf-8?B?" . base64_encode($subject) . "?="; |
zorx007 |
![]()
Сообщение
#11
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 177 Регистрация: 23-June 07 Из: Сахалин Пользователь №: 10,891 ![]() |
Когда мне довелось переводить базу Из UTF - 8 в православное CP 1251 я попусту использовал Notepad ++
![]() И это у меня прокатило как дети в школу ![]() думаю если использовать тот же метод то можно и наоборот базы сконвертировать.... PS оговорюсь сразу что химичил с базами движка DLE благодаря подсказке от Гугла ![]() |
![]() ![]() |
Текстовая версия | Сейчас: 26th April 2025 - 18:41 |