Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Проблема с кодировкой


Автор: Гость_Alex 24.4.2005, 07:25
Возможно ли нормально прочитать русскоязычные данные из *.xls не используя Spreadsheet::ParseExcel::FmtUnicode?
И если да, то как?
Заранее благодарен.

Автор: fedor-semakov 26.4.2005, 21:02
А в чем там проблема их прочитать то?
Они там в юникоде, берешь делаешь функцию перевода из юникода, и прогоняешь текст через нее.

Функцию можно самому написать, а можно выдрать из какого либо модуля, потому что зачем велосипед изобретать. smile


Автор: Гость_Alex 26.4.2005, 21:49
Обыскал все что мог, нигде. Возможно просто пока не повезло.
Если не трудно, закиньте кусок кода. Можно просто без дополнительной обработки и редакции из какой-нибудь проги. Я там сам обработаю (надеюсь на это).
Просто пока ничего не нашел подобного.

Автор: fedor-semakov 27.4.2005, 02:09
Посмотри сорц этого модуля например.

http://cpan.uwinnipeg.ca/htdocs/Unicode-Lite/Unicode/Lite.html

Тебе нужно utf16 to cp1251

Автор: Guest 27.4.2005, 06:09
Спасибо за ссылку
Остается только надеяться, что на серваке мне установят модуль Unicode::Lite smile
А существуют ли топорные способы перекодирования (без использования дополнительных модулей)?

Автор: Sadok 27.4.2005, 09:48
Код

sub utf8_to_win1251 {
    
    my $str = shift;
    
my %chars = (
"\xD0\xB0"=>"а", "\xD0\x90"=>"А",
"\xD0\xB1"=>"б", "\xD0\x91"=>"Б",
"\xD0\xB2"=>"в", "\xD0\x92"=>"В",
"\xD0\xB3"=>"г", "\xD0\x93"=>"Г",
"\xD0\xB4"=>"д", "\xD0\x94"=>"Д",
"\xD0\xB5"=>"е", "\xD0\x95"=>"Е",
"\xD1\x91"=>"ё", "\xD0\x81"=>"Ё",
"\xD0\xB6"=>"ж", "\xD0\x96"=>"Ж",
"\xD0\xB7"=>"з", "\xD0\x97"=>"З",
"\xD0\xB8"=>"и", "\xD0\x98"=>"И",
"\xD0\xB9"=>"й", "\xD0\x99"=>"Й",
"\xD0\xBA"=>"к", "\xD0\x9A"=>"К",
"\xD0\xBB"=>"л", "\xD0\x9B"=>"Л",
"\xD0\xBC"=>"м", "\xD0\x9C"=>"М",
"\xD0\xBD"=>"н", "\xD0\x9D"=>"Н",
"\xD0\xBE"=>"о", "\xD0\x9E"=>"О",
"\xD0\xBF"=>"п", "\xD0\x9F"=>"П",
"\xD1\x80"=>"р", "\xD0\xA0"=>"Р",
"\xD1\x81"=>"с", "\xD0\xA1"=>"С",
"\xD1\x82"=>"т", "\xD0\xA2"=>"Т",
"\xD1\x83"=>"у", "\xD0\xA3"=>"У",
"\xD1\x84"=>"ф", "\xD0\xA4"=>"Ф",
"\xD1\x85"=>"х", "\xD0\xA5"=>"Х",
"\xD1\x86"=>"ц", "\xD0\xA6"=>"Ц",
"\xD1\x87"=>"ч", "\xD0\xA7"=>"Ч",
"\xD1\x88"=>"ш", "\xD0\xA8"=>"Ш",
"\xD1\x89"=>"щ", "\xD0\xA9"=>"Щ",
"\xD1\x8A"=>"ъ", "\xD0\xAA"=>"Ъ",
"\xD1\x8B"=>"ы", "\xD0\xAB"=>"Ы",
"\xD1\x8C"=>"ь", "\xD0\xAC"=>"Ь",
"\xD1\x8D"=>"э", "\xD0\xAD"=>"Э",
"\xD1\x8E"=>"ю", "\xD0\xAE"=>"Ю",
"\xD1\x8F"=>"я", "\xD0\xAF"=>"Я",
);

    $str =~ s|([\xD0\xD1].)|$chars{$1}|sg;
    
    return $str;
}

Автор: Гость_Alex 28.4.2005, 07:50
Спасибо
Сейчас попробую

Автор: Гость_Alex 13.6.2005, 17:37
use Spreadsheet::ParseExcel::FmtUnicode поставили, ряд проблем автоматически исчез, но есть одна которую пока не могу решить

Парсю *.xls файл, но вместо колонок с

159,84 ;4 523,47 ;12 мес.
157,68 ;4 462,34 ;12 мес.
261,36 ;7 396,49 ;12 мес.

получаю

15..8 р .;4,52..4 р .;12 мес.
15..6 р .;4,46..3 р .;12 мес.
26..3 р .;7,39..4 р .;12 мес.

Не могу понять, в чем загвоздка.
На всякий случай приведу код

Код

#!/usr/bin/perl
print "Content-Type: text/html\n\n";

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;
my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>'CP1251');
my $oExcel = new Spreadsheet::ParseExcel;
my $oBook = $oExcel->Parse('d:/eee.xls',$oFmtJ);
my $oWkS = $oBook->{Worksheet}[0];
open (FFF,'>d:/eee.csv');
for(my $iR = 0; $iR <= 30; $iR++)
 {
   my $htm='';
   for(my $iC = 3; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++)
    { $oWkC = $oWkS->{Cells}[$iR][$iC];
      if ($oWkC) {$htm.= $oWkC->Value.';'} else {$htm.= ';'};
    }
   print FFF $htm,"\n";
 }
close FFF;


Единственное на что наткнулся - внутри *.xls файла есть строка charset="koi8-r".
Подставлял koi8-r вместо CP1251 все равно ерунда.

Буду признателен за любую помощь.
Если необходим первоисточник, черкану ссылку

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)