The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  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 | Индекс форумов | Темы | Пред. тема | След. тема


АКЦИЯ! ПОДПИШИСЬ на журнал Linux Format до 31 января 2012 года и выиграй СУПЕРПРИЗ!

Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

Каждый, кто оформит подписку, получает бонус- объёмные наклейки на системный блок и подарки: с одним из первых выпусков журнала в 2012 году- диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

Подробнее о проведении акции вы можете прочитать на странице сайта.


  Закладки на сайте
  Проследить за страницей
Created 1996-2012 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
RUNNet TopList