Forum Webscript.Ru

Программирование => Perl => Тема начата: Biggelow от 16 Июля 2006, 16:47:26

Название: UTF8
Отправлено: Biggelow от 16 Июля 2006, 16:47:26
Пытаюсь кодировать из win1251 в utf8:
use Encode;
use utf8;

utf8::encode(@mybanner[1]);

на выходе получаю какую то хрень:

Èíòåðåñíûå íîâîñòè

явно что-то не то...
Название: UTF8
Отправлено: Biggelow от 21 Июля 2006, 06:28:49
Ну чего ничкто не знает в чем может быть проблема? Никто в utf не кодирует?
Название: UTF8
Отправлено: arto от 21 Июля 2006, 09:29:49
# cat | rcode -futf8 -tcp1251 | perl -pnle \'use encoding "cp1251", STDOUT => "utf8"\'
Тестовая строка
^D
Тестовая строка
#
Название: UTF8
Отправлено: Biggelow от 21 Июля 2006, 11:34:18
arto
и где это писать?
у меня скрипт просто выдает текст по запросу в разных кодировках, только utf глючит.
Название: UTF8
Отправлено: arto от 21 Июля 2006, 12:02:38
perldoc encoding
Название: UTF8
Отправлено: Biggelow от 24 Июля 2006, 05:39:00
так я все делаю так как в perldoc, вот и спраштваю из-за чего может не работать?
Название: UTF8
Отправлено: Biggelow от 24 Июля 2006, 09:33:03
вот фрагмент кода:

if($code == 1){
print "Content-type: text/html\\n\\n";
print <<"(HTML_NOW)";
document.write("\'@mybanner[1]\'");
(HTML_NOW)
}elsif($code == 2){
print "Content-type: text/html\\n\\n";
@mybanner[1] = translate(\'win\',\'koi\',@mybanner[1]);
print <<"(HTML_NOW)";
document.write("\'@mybanner[1]\'");
(HTML_NOW)
}elsif($code == 3){
print "Content-type: text/html\\n\\n";
@mybanner[1] = translate(\'win\',\'iso\',@mybanner[1]);   
print <<"(HTML_NOW)";
document.write("\'@mybanner[1]\'");
(HTML_NOW)
}elsif($code == 4){
print "Content-type: text/html\\n\\n";
use encoding "cp1251", STDOUT => "utf8";
print <<"(HTML_NOW)";
document.write("\'@mybanner[1]\'");
(HTML_NOW)
}

if($code == 1 || $code == 2 || $code == 3){
no encoding;
}

уникод здесь не пашет, если no encoding убрать не пашут другие кодировки.
Название: UTF8
Отправлено: arto от 25 Июля 2006, 09:46:29
даже и не знаю чего сказать...
слишком много ошибок.
Название: UTF8
Отправлено: Biggelow от 26 Июля 2006, 05:59:47
Ну вообще первоначально все выглядело так, это я уже наворотил, чтобы хоть как-то заработало:

print "Content-type: text/html\\n\\n";

if($code == 1){
#ничего не меняем
}elsif($code == 2){
@mybanner[1] = translate(\'win\',\'koi\',@mybanner[1]);#отдельная ф-ция
}elsif($code == 3){
@mybanner[1] = translate(\'win\',\'iso\',@mybanner[1]);#отдельная ф-ция
}elsif($code == 4){
use encoding "cp1251", STDOUT => "utf8";
}

print <<"(HTML_NOW)";
document.write("\'@mybanner[1]\'");
(HTML_NOW)

Теперь можете подсказать?
Название: UTF8
Отправлено: arto от 26 Июля 2006, 10:29:49
perldoc -f use
Название: UTF8
Отправлено: Biggelow от 27 Июля 2006, 07:24:15
не помогает!
пишу "no encoding" после вывода use encoding "cp1251", STDOUT => "utf8";
тогда utf8 не работает, а если не пишу "no encoding" тогда все в utf8.
Название: UTF8
Отправлено: arto от 27 Июля 2006, 09:47:29
такое впечатление, что вы не знаете как работает use, и не читали perldoc encoding
Название: UTF8
Отправлено: Biggelow от 27 Июля 2006, 10:53:35
Читал. Из perldoc:

# A simple euc-cn => utf-8 converter
use encoding "euc-cn", STDOUT => "utf8";  while(<>){print};

# "no encoding;" supported (but not scoped!)
no encoding;

# an alternate way, Filter
use encoding "euc-jp", Filter=>1;
# now you can use kanji identifiers -- in euc-jp!

Т.е. вначале utf, а потом euc-jp. Но у меня этот no encoding почему то не срабатывает...
Название: UTF8
Отправлено: Biggelow от 30 Июля 2006, 05:30:08
arto
понятно, вообщем не было чего ответить, НО сумничал...
Название: UTF8
Отправлено: Wyclef от 30 Июля 2006, 09:31:11
Biggelow
arto хотел сказать, что "use" отработает до начала всех проверок (разница require и use), а в "perldoc Encoding" - тоже есть вся нужная вам информация.

А вообще:
use Encode;

my $string = "Привет мир!";

Encode::from_to($string, \'windows-1251\', \'utf8\');

print $string;
Название: UTF8
Отправлено: arto от 30 Июля 2006, 14:59:37
# print "Тестовая строка" | perl -plne \'BEGIN{ use encoding "koi8-r",STDOUT => "cp1251"}\' | iconv -f CP1251 -t KOI8-R
Тестовая строка
# print "Тестовая строка" | perl -plne \'BEGIN{ use encoding "koi8-r",STDOUT => "utf8"}\' | iconv -f UTF8 -t KOI8-R
Тестовая строка
#