1 (изменено: Vit, 2009-03-05 15:33:17)

Тема: Кодировка

Здравствуйте!

Сначала лирическое отступление. Просмотрел много тем и был приятно удивлен тем, насколько подробно, обстоятельно и дружелюбно отвечает на вопросы страждущих модератор Hanut. Не на каждом форуме встретишь такое отношение.

Теперь по делу. Как я понял, нет одного решения на все случаи, каждый раз требуется конкретное разбирательство. Поэтому попытаюсь описать свою проблему как можно подробней.

Имеется трехязычный магазин: английский, немецкий, русский. Основной язык - английский.
В языковых файлах стоят следующие кодировки:

английский - en_US.ISO_8859-1
немецкий - de_DE.ISO_8859-1
русский - ru_RU.CP1251

В Базе Данных:

SHOW GLOBAL VARIABLES LIKE 'character%'

Variable_name  Value 
character_set_client latin1
character_set_connection latin1
character_set_database latin1
character_set_filesystem binary
character_set_results latin1
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/


SHOW VARIABLES LIKE 'character%'

Variable_name  Value 
character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

В одной таблице могут находиться данные на всех трех языках. На русском языке выглядит вот так:

????????????????? ???????????
???????????? ??????????????

На сайте все отображается нормально.

Хочу переделать все в UTF-8. Попробовал самостоятельно - не получилось, поэтому прошу помощи.

2

Re: Кодировка

Vit сказал:

Хочу переделать все в UTF-8.

Очень здравое решение.

Первая часть - это создание дампа и перекодирование его в utf8. Здесь есть существенная проблема - Если перекодировать кириллицу ????????????????? - велика вероятность, что у немецких символов слетят умляуты. Проверить это можно только опытным путем. Скрипт перекодировки с инструкцией его использования, - вышлю.

Вторая часть - установка кодировки соединения с MySQL в utf8 (сейчас она у вас latin1 - character_set_connection). Здесь тоже два возможных решения: установка глобальной кодировки соединения в my.cnf, которая будет использоватся для всех скриптов; правка кода скрипта и прописывание в нем запроса на установку кодировки соединения.
1) my.cnf, раздел [mysqld]. Добавить строку:
init-connect="SET NAMES utf8"
Также проверьте значение в данной директиве:
default-character-set=utf8

2) Делаем поиск по файлам скрипта, ищем функцию mysql_connect Сразу после нее добавляем строку:
mysql_query('SET NAMES utf8');

3

Re: Кодировка

Спасибо, скрипт получил, попробовал, не получилось.

Что бы я не выбрал, TRANSLIT или IGNORE, получаю Detected an illegal character.

Может быть дело в:

5) Далее, из выпадающих списков выберите From utf-8 To iso-8859-1.

Мне не понятно, почему From utf-8, или здесь все правильно?

4

Re: Кодировка

Vit
Не могу пока поправить скрипт перекодировки, поэтому если хотите, то можете отослать мне запакованный дамп на hanut@php-myadmin.ru Постараюсь перекодировать.

5

Re: Кодировка

Hanut, Извините, если вопрос глуп и не оригинален... У меня несколько другая проблема. Все с Бд было нормально. Все документы и темплаты на игру у меня написаны в кодировке utf-8, а в базе данных в структуре на предметы, действия, имена и прочее, я поставила cp1251_general_ci. Три месяца работало все ок. Недели две (может больше) назад вся база данных превратилась в большую проблему. Все русские ники и вообще весь русский текст, именно в самой базе слетел и вместо него страшные кракозябры -" Гиблая топь" и какие либо попытки исправить это - приводят к еще большим проблемам. Сначала я вручную начала переименовывать заново все русские ники как положено. Т.е. Был ник Кано, в базе он отображается как ББББ, меняю обратно на кано и получаю ник в базе Кано, а вот в игре вот так -  ГиблР. И что делать? Добавлять я сейчас ничего не могу. У меня сюжет построен через базу и мне необходимо добавлять все новое и новое, а я почти месяц сижу и ничего исправить не могу. Онлайн игроков упал до 3. Подскажите, если вам не сложно. Спасибо.

6

Re: Кодировка

Нинок
Крякозябы надо перекодировать, затем во всех скриптах прописать кодировку соединения и установить ее в utf8. Если есть доступ к конфигурационному файлу MySQL, то можно скрипты оставить как есть, но добавить в него строку устанавливающую кодировку соединения:
init-connect="SET NAMES utf8"

Также следует поправить:
default-character-set=utf8

По перекодировке надо больше конкретных данных:
1) Структура любой таблицы имеющей поля с кириллицей.
2) Выполните запрос и покажите его вывод:

SWOW GLOBAL VARIABLES LIKE 'char%';

3) Покажите крякозябы точно, как вы их видите в дампе.

Перекодировка может быть крайне сложной и запутанной операцией, поэтому, если требуется быстро все сделать, то пришлите дамп на hanut@php-myadmin.ru, посмотрю, что там можно сделать.

Установка кодировки соединения в скриптах делается так.
После каждого вызова функции mysql_connect следует добавить строку:

mysql_query('SET NAMES utf8');