Xpoint
   [напомнить пароль]

Русский язык в Spreadsheet::WriteExcel

Метки: [без меток]
[удл]
2004-09-27 17:45:25 [обр] Кирилл[досье]

Здравствуйте!

Как бороться с тем, что вместо русских букв появляеться абракатабра?
В описании синтаксиса компонента показано,
как добавить фразу на русском, но для этого её нужно перевести в hex.

    # Write a phrase in Cyrillic using a hex-encoded string
    #
    my $uni_str = pack "H*", "042d0442043e0020044404400430043704300020043d" .
                             "043000200440044304410441043a043e043c0021";
    $worksheet->write_unicode('A5', $uni_str);

Тогда как это сделать с текстом? И есть ли другие способы борьбы с этим?

спустя 3 минуты [обр] Алексей В. Иванов(25/2861)[досье]
Что за бред?!
Я всегда прямой кодировкой windows-1251 писал и никаких проблем не было.
спустя 5 минут [обр] Алексей Севрюков(61/1292)[досье]
Кирилл[досье] Так это не совсем hex, это unicode, может объект поддерживает какие-нибудь другие методы записи?
спустя 9 минут [обр] Алексей В. Иванов(25/2861)[досье]
Извиняюсь, я ошибся. Это в PHP в данном модуле 1251. В Perl unicode.
Попробуйте по ману сделать:
    my $map   = Unicode::Map->new("WINDOWS-1251");
    my $utf16 = $map->to_unicode("Пример");

    $worksheet->write_unicode('A7', $utf16);
спустя 46 минут [обр] Кирилл[досье]

Алексей В. Иванов[досье] Нет пробовал и CP1251, все равно.

Алексей Севрюков[досье] да он еще поддерживает write, write_string и т.д.
Естественно я ими в начале и пытался запихнуть данные, но почему-то кодировка получаеться не та которая нужна. В форумах такой вопрос по поводу модуля Spreadsheet::WriteExcel я не нашел, обычно поднимаеться по поводу русского в Spreadsheet::ParseExcel. Пробовал использовать те же методы, ничего не выходит.

спустя 2 часа 57 минут [обр] Эмиль Бекиров aka superbizon(6/19)[досье]
Кирилл[досье] Попробуйте так
Xpoint FAQ:Как работать с файлами Excel?
спустя 1 день 13 часов [обр] Phoinix_RW[досье]

Кирилл[досье]

У меня возникла та же трабла... обошел использованием более устаревшей версии Spreadsheet::WriteExcel 0.43

В ней вообще не надо ничего указывать...

А в версиях 2.х еще трабла, если в ячейках можно писать в кодировке 1251, то названия листов, только по аглицки...

спустя 11 месяцев [обр] Black(0/3)[досье]

Для исправления кодирвоки, используйте модуль Encode::Encoding

use encoding "ru_RU.CP1251";
use Spreadsheet::WriteExcel;

my $workbook=Spreadsheet::WriteExcel->new("-");
my $worksheet=$workbook->add_worksheet("лист 1");
$worksheet->write_string(0, 0, "текст по Русски");

Perl 5.8.4
Spreadsheet::WriteExcel 2.15
Encode 2.12

спустя 19 минут [обр] Владимир Палант(146/4445)[досье]
Странную вы ссылку дали. Вы ведь модуль encoding имели в виду?
спустя 2 часа 43 минуты [обр] Black(0/3)[досье]
Владимир Палант[досье]
совершенно верно, немного промахнулся ...
спустя 4 часа 8 минут [обр] Закиров Руслан(51/343)[досье]
use Encode qw(decode);
$workbook->add_worksheet(decode('cp1251', 'мой текст в кодировке cp1251'));

Или пользоваться редактором с поддержкой UTF-8 и использовать прагму utf8.

Black[досье] правильнее писать

use encoding "CP1251";
спустя 2 года 1 месяц [обр] ivz[досье]

Добрый день, уважаемые!

Похоже, все успешно решили проблему топика, раз два года сюда никто не писал...
А у меня не получается победить данную проблему.
Установка Encode решает проблему на уровне инициализированных переменных в тексте программы. Данные же MySQL выводятся в ёксель в нечитаемых символах. Уже склоняюсь к использовании версии 0.43, как тут советовали. Но, думается, не зря новые версии создавались, отлавливать баги не хотелось бы...

спустя 6 дней [обр] Spectrum2(4/26)[досье]
ivz[досье]Если работает "на уровне инициализированных переменных в тексте программы", то и данные из mySQL тоже будут.
use Encode;
my $data = $dbh->selectrow_array("select...");
$data = Encode::decode('XXX', $data);  # вместо XXX указываете кодировку, в которой хранятся данные в базе, например, cp1251
спустя 7 месяцев [обр] ХОТТАБЫЧ[досье]
На самом деле все намного проще, чем думаем :)
Просто нужно НЕ кодировать во что-то (win1251, cp1251, hex, unicode...), а всего лишь разкодировать из Вашей кодировке (в которой у Вас базы, скрипты и пр...) в локальную! Для этого пользуемся функцией Encode::decode
спустя 5 минут [обр] Алексей Севрюков(61/1292)[досье]
ХОТТАБЫЧ[досье] Читаем пост выше. Думаем.
Powered by POEM™ Engine Copyright © 2002-2005