Проблема с отображением буквы ш

Тема в разделе "PHP", создана пользователем Obormot, 16 мар 2012.

Модераторы: latteo
  1. Obormot

    Obormot Постоялец

    Регистр.:
    10 янв 2012
    Сообщения:
    88
    Симпатии:
    2
    Если по форуму было - сорри.

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

    В чем может быть проблема?

    Кодировка: сами php-файлы в ANSI, в браузере скрипт выдает кодировку UTF-8, БД в
    utf8_general_ci
    .
     
  2. Genk0

    Genk0 Инквизитор из раздела J!

    Moderator
    Регистр.:
    2 июн 2010
    Сообщения:
    1.627
    Симпатии:
    1.330
    /*
    Частенько встречается при переносе бд, либо при шаманстве с кодировками
    буквы "ш" и "И" оказываются битыми (речь идет о utf-8 конечно)
    буква "ш" = chr(209).chr(63) / правильно chr(209).chr(136)
    буква "И" = chr(208).chr(63) / правильно chr(208).chr(152)
    Чтобы пофиксить делаем 2 запроса
    */

    Код:
    UPDATE `tbl` SET `pole` = REPLACE(
    `pole`,
    CONCAT( CHAR(209), CHAR(63) ),
    CONCAT( CHAR(209), CHAR(136) )
    );
    UPDATE `tbl` SET `pole` = REPLACE(
    `pole`,
    CONCAT( CHAR(208), CHAR(63) ),
    CONCAT( CHAR(208), CHAR(152) )
    );
    естественно заменить свои поля и таблицы
     
    Obormot нравится это.
  3. Obormot

    Obormot Постоялец

    Регистр.:
    10 янв 2012
    Сообщения:
    88
    Симпатии:
    2
    Спасибо, суть понятна.

    Подскажите нельзя составить запрос что бы пробежаться по всей базе и заменить что требется.
    Скрипт большое, таблиц много, не могу прошарить где могут содержаться данные.
     
  4. BACZ

    BACZ

    Регистр.:
    18 июн 2008
    Сообщения:
    608
    Симпатии:
    381
    только базу убьёшь
    а результат лучше не станет. Лечится подбором кодировок в .my.cnf или my.ini и реимпортом базы. Плюс нормальные настройки кодировки для mysql в самой CMS. Вообще характерно такое в основном для вбулки, друпала и вордпресса.
     
  5. Obormot

    Obormot Постоялец

    Регистр.:
    10 янв 2012
    Сообщения:
    88
    Симпатии:
    2
    BACZ модно поподрбнее про ".my.cnf или my.ini и реимпортом базы"
    Нормальные настройки ? Вроде везде все прописано, в БД UTF, сам скрипт выводит кодировку в страницах..
     
  6. BACZ

    BACZ

    Регистр.:
    18 июн 2008
    Сообщения:
    608
    Симпатии:
    381
    В файле конфига для mysql(my.cnf под *nix или my.ini в виндах) можно задать несколько разных параметров для кодировки - для сервера и клиента типа "default-character-set".
    Плюс кодировка в свойствах самой базы. Плюс кодировки у таблиц. Плюс в классе для mysql от cms или каком нибудь там init.php - ещё под десяток (character_set_database, collation_database, character_set_client, character_set_connection,character_set_results,character_set_server, collation_server,character_set_system и names). Из этого можно получить довольно неприятный кодировочный суп.

    Можно сделать дамп базы в текущем её виде и посмотреть в какой там всё кодировке. Проблема с Ш и И - это как правило "дважды уникод" - когда дамп в редакторе в кодировке utf-8 всё равно выглядит как utf-8 при кодировке ANSI. Через set names и т д от всего этого можно добиться "почти русского" текста, но Ш, И и вроде ещё какая то одна теряются безвозвратно (превращаются в "квадратик", "знак вопроса" и тд) Перекодировать их посимвольно в базе - это костыль не от того и не туда. Сначала должны быть нужные настройки в конфигурации mysql, потом в конфигурации CMS, потом под это заново льётся дамп и только потом уже смотреть в сторону посимвольной замены. Кстати всякие аттачи и бинарные штуки в таблицах бьются от кодировочной каши на ура - вон на форуме античат ни одного живого вложения в архиве из сообщений за 2010 и раньше на текущий момент нет.
     
  7. Obormot

    Obormot Постоялец

    Регистр.:
    10 янв 2012
    Сообщения:
    88
    Симпатии:
    2
    Это я так понимаю настройки хостинга, у меня нет доступа к ним.

    N++ показывает кодировку файла который заливается при инталяции в БД (install.sql)
    ANSI as UTF-8
    первые строки этого файла базы данных:
    Код:
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";;
    ALTER DATABASE DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;;

    может быть в этом проблема?
     
  8. BACZ

    BACZ

    Регистр.:
    18 июн 2008
    Сообщения:
    608
    Симпатии:
    381
    Obormot нравится это.
  9. Obormot

    Obormot Постоялец

    Регистр.:
    10 янв 2012
    Сообщения:
    88
    Симпатии:
    2
    Если сливать дамп через phpmyadmin то там при экспорте задается кодировка (либо UTF-8 либо 1251 и т.д.), или я чего то не понимаю ?
    Как посмотреть какая кодировка у русских символов в БД ?
     
  10. BACZ

    BACZ

    Регистр.:
    18 июн 2008
    Сообщения:
    608
    Симпатии:
    381
    слить через Sypex Dumper или mysqldump(комстрока) например.

    Вот например (опять же пример для размышления) страдания по вбулке
    http://vbsupport.org/forum/showthread.php?t=23843
     
    Obormot нравится это.