Перешёл на новый хостинг, система та же осталась, freebsd, и один из скриптов перестал работать.
Он скачивает данные с другого https сайта и сохраняет их в базу.
Данные в кодировке cp1251, база, таблицы и соединение mysql в той же кодировке.
my.cnf:
character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect="SET NAMES cp1251"
Когда соединяюсь с базой из скрипта, выполняю:
$dbh->do('SET CHARACTER SET cp1251');<br>
Данные выкачиваются так:
$ua = new LWP::UserAgent;<br>
....<br>
$res = $ua->get(....)<br>
$s = $res->decoded_content();<br>
<br>
Потом перменная $s парсится и результат вставляется в базу. И в базе кодировка испорченная:
Ñáåðáà ГГЄ ГђГ” (ÌÑÊ), ïîïîëГГҐГГЁГҐ
Очень странную вещь обнаружил, ковыряясь со скриптом. Если просто сохранить полученные данные в текстовый файл, потом их из этого же файла прочесть и вставить в базу — кодировка не портится!
Если просмотреть этот текстовый файл, видно что кодировка там правильная, cp1251
Что изменилось с предыдущего хостинга:
perl: было 5.10.1, стало 5.14.4
libwww: было 5.835, стало 6.05
mysql server как был, так и остался 5.1
UPDATE: Только что обнаружил. Если вместо $res->decoded_content() написать $res->content(), то всё работает.
Возможно, из-за того, что у скачиваемой страницы нет в заголовках charset.
Но я всё равно не понимаю, что происходит со строкой, что если её в базу вставить, она в неправильной кодировке, а если в файл записать — то в правильной. То ли utf-флаг какой-то ставится? Не понимаю :(