The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Perl Spreadsheet::WriteExcel cp1251"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Perl Spreadsheet::WriteExcel cp1251"  +/
Сообщение от Azudim email(ok) on 14-Мрт-10, 19:36 
Такая проблемка - не получается корректно передать в XLS файл данные из MySQL.

MySQL (default charset latin1)  Win32
Perl Win32

Сам pl файл в ANSI (cp1251), если в скрипте на русском писать - в Excel падает нормально, а из MySQL ну никак не хочет перекодироваться..

---------
#!/usr/local/bin/perl

use 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 кодируется нечитаемо =(

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Perl Spreadsheet::WriteExcel cp1251"  +/
Сообщение от ACCA (ok) on 14-Мрт-10, 23:18 
>MySQL (default charset latin1)  Win32

[...]
> # @data - массив ссылок на хэши вида $hash{заголовок_столбца}=значение_ячейки из DBI
>MySQL

Если у тебя в MySQL лежит CP1251, ты ему врёшь, что там latin1, а потом он перекодировал latin1 в CP1251, получаешь грабли.

Если в MySQL лежит latin1, а ты его вываливаешь без перекодирования как 1251, получаешь другие грабли.

Убедись, что до @data добрался CP1251. enca тебе в помощь.

Сейчас правоверный подход - держать по всему пути от SQL базы до консоли UTF8. Приводить к CP1251 или CP866 нужно только в специальных случаях, например, под древней полуосью.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Perl Spreadsheet::WriteExcel cp1251"  +/
Сообщение от Azudim email(??) on 15-Мрт-10, 09:18 
>>MySQL (default charset latin1)  Win32
>
>Убедись, что до @data добрался CP1251. enca тебе в помощь.
>

Меня смущает то, что в какой бы кодировке не была @data ведь в cp866 для вывода в консоль Encode конвертирует нормально, значит и в cp1251 он корректно может (ли?) перекодировать. Да и в остальном нет проблем с выводом из базы, в чем бы там не лежало.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Perl Spreadsheet::WriteExcel cp1251"  +/
Сообщение от Azudim email(ok) on 15-Мрт-10, 11:19 
Победа!

---------
#!/usr/local/bin/perl

use 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 =)

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру