Проблема с кодировками

Эдди

Новичок
Проблема с кодировками

Я готов уже биться головой об стенку. Помогите, пожалуйста.

Есть чат стороннего разработчика. Создает таблицу в моей БД.
При создании charset не указан.
Пишет в БД кракозябры типа Задайте Р’Р°С? РІРѕРїСЂРѕСЃ...
По крайней мере в mysqlmyadmin так выглядит текст.
Тем не менее при выводе русский текст выглядит корректно.

Под чатом добавляю свой кусок кода. Русские буквы выводятся нормально. Но не все.
К примеру заглавная "И" выглядит как Р+ромбик в вопросительным знаком.
На этом проблемы не заканчиваются. Но решить хотя бы это.

Я правда запутался в кодировках. Факи читал. Не получается ничего...
 

Эдди

Новичок
Читал.

Страница имеет кодировку utf-8:
header("Content-Type: text/xml; charset=UTF-8");

Все таблицы базы данных - cp1251_general_ci

Где правильнее делать перекодирование?
 

Вурдалак

Продвинутый новичок
Если таких полей не очень много, то можно вручную или скриптом переделать тип поля на BLOB, затем обратно уже с корректным collation.

Либо выкачать дамп (c cp1251_general_ci), поменять везде где требуется charset и collation, сохранить как файл в windows-1251, затем открыть его как файл в UTF-8. Залить дамп на сервер.
 

Фанат

oncle terrible
Команда форума
перекодировать ничего не нужно.
нужно просто прочитать первые две строчки фака
 

Вурдалак

Продвинутый новичок
*****, тут как бы исправление требуется, а не SET NAMES. Или ты про что?
 

Фанат

oncle terrible
Команда форума
так это ж чат. там по определению данные не хранятся. нечего перекодировать
 

Mols

Новичок
Вурдалак
исправление не требуется(если конечно не нужна поддержка языков кроме русского/английского)
требуется.
Автор оригинала: Арарат
... просто прочитать первые две строчки фака
 

Вурдалак

Продвинутый новичок
Ну, для таблицы с сообщениями действительно не нужна перекодировка. Для остальных — вполне.

-~{}~ 15.10.10 13:08:

Mols, у него сайт в UTF-8, причём тут русский/английский?
 

Эдди

Новичок
Скажите одно.
Если сайт пишет в БД нечто подобное ывап ыв апывапы Рї РІ (Имеется в виду в phpmyadmin. К терминалу доступа не имею.)
А потом забирает и выводит нормальной кириллицей - это нормально???

Мои собственные таблицы везде отображают нормально русский шрифт.
 

iceman

говнокодер
Вурдалак
на BLOB разве действует текущая кодировка сессии?
 

Вурдалак

Продвинутый новичок
Просто phpMyAdmin (или где ты там смотришь?) выводит данные «по-честному» в соответствии с той кодировкой и сопоставлением, что указано в поле, а твой скрипт под видом cp1251 толкает туда и забирает оттуда данные в UTF-8.

-~{}~ 15.10.10 13:26:

iceman, у BLOB вообще кодировки нет по определению. Когда из TEXT в BLOB переводишь, то данные остаются как есть. А если тупо поменять кодировку для поля, то и сами данные будут изменены.
 

Эдди

Новичок
Автор оригинала: Вурдалак
Просто phpMyAdmin (или где ты там смотришь?) выводит данные «по-честному» в соответствии с той кодировкой и сопоставлением, что указано в поле, а твой скрипт под видом cp1251 толкает туда и забирает оттуда данные в UTF-8.
Уже ближе.

Дописываю к скрипту свой фрагмент.
Преобразовавыю данные из базы iconv("UTF-8","windows-1251",$var)
Почти все конвертируется нормально, кроме некоторый буков.
Сейчас помню только про заглавную И.
 

Mols

Новичок
Вурдалак
При том, что пофигу в какой кодировке сайт.
Важно какой набор символов он должен обслуживать.
ЮТФ-8 вполне может обслуживать массу языков.
В том числе и русский.
База в windows-1251 - вполне может обслуживать кирилический набор символов.
Итого, если достаточно, чтобы сайт работал только с русским языком вполне приемлемо иметь странички в ЮТФ-8 и базу в windows-1251.
Это из разряда "ежу понятно".

Но... ежу может быть не понятно, что для того, чтобы это работало надо БАЗЕ СКАЗАТЬ в какой кодировке САЙТ отдаёт/ожидает данные.
Для того, чтобы это сделать, можно прочитать фак и "сказать базе"....
А можно делать так, как делает Эдди.
Для каждого значения делать перекодировку.
Потому как база(сейчас) ожидает данные в windows-1251(похоже, что именно так) и получает как ожидает.
Это НЕ правильно, но будет работать(пока он скажем не переедет на другой хостинг, где база будет по дефолту ждать данные в ЮТФ. ).

-~{}~ 15.10.10 12:56:

просто надо чётко разобраться.
1. В какой кодировке база "ждет" данные
2. В какой кодировки скрипт их отдаёт базе
3. В какой кодировке база отдаёт скрипту
4. В какой кодировке скрипт ждет от базы
[telepat mode]
У Вас видимо все Ваши странички в windows-1251, а "стороний чат" в ЮТФ.
Поэтому 2 пути.
1й - перевести весь этот чат на windows-1251
2й - для чата везде указывать кодировку соединения с базой как UTF.
[/telepat mode]
 

Фанат

oncle terrible
Команда форума
Потому как база(сейчас) ожидает данные в windows-1251
я бы сказал что latin1 она ожидает

или нет. туплю. latin1 она ожидать не может - иначе были бы вопросики.
 

Эдди

Новичок
Вот такая команда выводит все корректно в phpmyadmin :
SELECT CONVERT(CONVERT(поле USING binary) USING utf8) FROM таблица

Значит данные сохраняются в таблице с кодировкой cp1251 в кодировке utf8. Ужас:)
 

Эдди

Новичок
Автор оригинала: *****
то есть, использовался запрос set names cp1251?
Нет. set names не дает преобразование с сайта в кодировке utf8 в сз1251
Запрос вводился напрямую в окне запросов phpmyadmin.

В стороннем скрипте задается кодировка только в одном месте:
Content-Type: text/xml; charset=UTF-8
 

Фанат

oncle terrible
Команда форума
если бы на сайте вообще не было set names или mysql_set_charset, то в базе были бы вопросики.
 
Сверху