Такая проблемка - не получается корректно передать в XLS файл данные из MySQL.MySQL (default charset latin1) Win32
Perl Win32Сам pl файл в ANSI (cp1251), если в скрипте на русском писать - в Excel падает нормально, а из MySQL ну никак не хочет перекодироваться..
---------
#!/usr/local/bin/perluse encoding "ru_RU.CP1251";
use Encode;my $workbook = Spreadsheet::WriteExcel->new('test.xls');
$worksheet = $workbook->add_worksheet('Тест');
$worksheet->write('B5', "№№");
$worksheet->write('C5', "Наименование");my $i=6;
# @data - массив ссылок на хэши вида $hash{заголовок_столбца}=значение_ячейки из DBI MySQL
foreach my $k (@data) {
$worksheet->write($i,1,$$k{'t1.num'});
$worksheet->write($i,2,$$k{'t1.name'});
my $str = $$k{'t1.name'};
Encode::from_to($str, 'cp1251', 'cp866');
print "\n Имя: $str";
$i++;
}Заголовок таблички получается нормально - читаемый русский, а в ячейки вставляется в виде:
Àêàäåìèÿ ðàî
Áîãîðîäñêèé õðàì
Áîãîðîäñêèé õðàì
Äîì ïðàâîñóäèÿ
Îáúåäèíåíèå ëèò
Ïðîãîííàÿ 1-ÿ óë.
Õðîìîâà óë.
Õðîìîâà óë.вывод в консоль в cp866 показывает читаемо.
Пробовал всевозможные комбинации кодирования - результат один - из самого скрипта прописанный текст читается, а пришедший из SQL кодируется нечитаемо =(
>MySQL (default charset latin1) Win32[...]
> # @data - массив ссылок на хэши вида $hash{заголовок_столбца}=значение_ячейки из DBI
>MySQLЕсли у тебя в MySQL лежит CP1251, ты ему врёшь, что там latin1, а потом он перекодировал latin1 в CP1251, получаешь грабли.
Если в MySQL лежит latin1, а ты его вываливаешь без перекодирования как 1251, получаешь другие грабли.
Убедись, что до @data добрался CP1251. enca тебе в помощь.
Сейчас правоверный подход - держать по всему пути от SQL базы до консоли UTF8. Приводить к CP1251 или CP866 нужно только в специальных случаях, например, под древней полуосью.
>>MySQL (default charset latin1) Win32
>
>Убедись, что до @data добрался CP1251. enca тебе в помощь.
>Меня смущает то, что в какой бы кодировке не была @data ведь в cp866 для вывода в консоль Encode конвертирует нормально, значит и в cp1251 он корректно может (ли?) перекодировать. Да и в остальном нет проблем с выводом из базы, в чем бы там не лежало.
Победа!---------
#!/usr/local/bin/perluse encoding "ru_RU.CP1251";
use Encode;my $workbook = Spreadsheet::WriteExcel->new('test.xls');
$worksheet = $workbook->add_worksheet('Тест');
$worksheet->write('B5', "№№");
$worksheet->write('C5', "Наименование");my $i=6;
# @data - массив ссылок на хэши вида $hash{заголовок_столбца}=значение_ячейки из DBI MySQL
foreach my $k (@data) {
foreach $key (keys(%$k)) {
Encode::from_to($$k{$key}, 'cp1251', 'unicode'); #Конвертим приход из DBI
}
$worksheet->write($i,1,$$k{'t1.num'});
$worksheet->write($i,2,$$k{'t1.name'});
$i++;
}
------------------------------
По итогу текст набранный на русском в самом скрипте пишется нормально как исходный cp1251, а пришедший из DBI (хоть и тоже в cp1251 - проверено Enca) читается нормально только после перекодирования в unicode =)