![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
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 что для компа не число вообще. То есть региональные настройки ставятся, а для РФ они по умолчанию очень левые в понимании компа. Вывод - не писать это или конвертить аккуратно циферьки, как в другой статье было. Вот теперь все. Если что еще отвалится, то алгоритм будет пополняться новыми "граблями" ![]() |
![]() ![]() |
zorx007 |
![]()
Сообщение
#2
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 177 Регистрация: 23-June 07 Из: Сахалин Пользователь №: 10,891 ![]() |
Когда мне довелось переводить базу Из UTF - 8 в православное CP 1251 я попусту использовал Notepad ++
![]() И это у меня прокатило как дети в школу ![]() думаю если использовать тот же метод то можно и наоборот базы сконвертировать.... PS оговорюсь сразу что химичил с базами движка DLE благодаря подсказке от Гугла ![]() |
![]() ![]() |
Текстовая версия | Сейчас: 26th April 2025 - 18:28 |