Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с перекодированием 
:(
    Опции темы
infarch
Дата 1.6.2010, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



К стыду своему должен признаться, что банальная с виду задача по перекодированию текста из utf8 в cp1251 поставила меня в тупик. Вроде все делаю "как книга пишет", а в ответ получаю или сообщения об ошибках, или Buchstabensalat.
Помогите пожалуйста! Дайте примитивный но рабочий пример для изучения!
PM MAIL   Вверх
arto
Дата 1.6.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perl -plne 'BEGIN { use encoding "cp1251",STDOUT => "utf8" }'
PM MAIL ICQ   Вверх
infarch
Дата 1.6.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Попытался это выполнить и получил ошибку: Can't find string terminator "'" anywhere before EOF at -e line 1.

Да и выглядит это немного неприменимо к моим целям. Я не хочу на лету перекодировать файлы. Мне нужно провести трансформацию отдельно взятой строки. Но даже если брать файлы... вот взгляните на пример:

Код

    open SRC, 'cp.txt' or die $!;
    open DEST, '>:utf8', 'dest.txt' or die $!;
    
    while (<SRC>){
        print DEST;
    }

    close SRC;
    close DEST;


У меня этот скрипт работает неправильно - в результате непонятные символы вместо utf. В чем может быть проблема?
PM MAIL   Вверх
arto
Дата 1.6.2010, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# print "как книга пишет" | iconv -f koi8-r -t cp1251 | perl -plne 'BEGIN { use encoding "cp1251",STDOUT => "utf8" }' | iconv -f utf8 -t koi8-r
как книга пишет
# 

# perl -e 'open F,"<:encoding(CP1251)",$ARGV[0]; open G,">:encoding(UTF-8)", $ARGV[1]; while (<F>) { print G; }' /tmp/test.txt /tmp/test.txt.utf
# cat /tmp/test.txt.utf | iconv -f utf8 -t koi8-r
как книга пишет
#
PM MAIL ICQ   Вверх
infarch
Дата 1.6.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Возвращаясь к моему примеру: я подправил пару строк и добился перекодировки из cp1251 в utf8:

Код

    open SRC, '<:encoding(CP1251)', 'cp.txt' or die $!;
    open DEST, '>:encoding(UTF-8)', 'dest.txt' or die $!;


А вот как произвести обратную трансформацию? Я пробовал просто поменять енкодинги:

Код

    open SRC, '<:encoding(UTF-8)', 'utf.txt' or die $!;
    open DEST, '>:encoding(CP1251)', 'dest.txt' or die $!;


А в результате получил коллекцию ошибок типа: "\x{00d8}" does not map to cp1251 at...

Как можно провести такое преобразование?

Это сообщение отредактировал(а) infarch - 1.6.2010, 16:25
PM MAIL   Вверх
arto
Дата 1.6.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



у меня работает.

# perl -e 'open F,"<:encoding(UTF-8)",$ARGV[0]; open G,">:encoding(KOI8-R)", $ARGV[1]; while (<F>) { print G; }' /tmp/test.txt /tmp/test.txt.koi
# cat /tmp/test.txt.koi
как книга пишет
#
PM MAIL ICQ   Вверх
infarch
Дата 1.6.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Так тоже не работает. Аналогичная ошибка: "\x{00d8}" does not map to koi8-r at...
Может разница в среде выполнения? Я запускаю скрипт под виндой и использую Active Perl 5.8.8
PM MAIL   Вверх
arto
Дата 1.6.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



может быть. у меня линух
PM MAIL ICQ   Вверх
arto
Дата 1.6.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



попробовал на виндовс, нормально.
C:\>perl -v

This is perl, v5.10.0 built for MSWin32-x86-multi-thread
(with 9 registered patches, see perl -V for more detail)
PM MAIL ICQ   Вверх
infarch
Дата 2.6.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Вы правы, работает. Это я лоханулся - в тестовом файле были датские символы. А для них таки нет соответствия в cp1251. Так что вопрос с файлами можно считать закрытым.

Но есть другой вопрос: как производить преобразование на уровне скаляров, без записи в файл?
PM MAIL   Вверх
arto
Дата 2.6.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



у меня сложилось впечатление, что вы категорически не желаете читать документацию.
PM MAIL ICQ   Вверх
infarch
Дата 2.6.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Документация предоставляет много вариантов, так что я даже и не знаю какой метод предпочтительнее.
PM MAIL   Вверх
arto
Дата 2.6.2010, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc Encode

# perl -MEncode=from_to -le '$a = "Документация предоставляет много вариантов"; from_to ($a,"koi8-r","utf8"); print $a' | iconv -f utf8 -t koi8-r
Документация предоставляет много вариантов
#
PM MAIL ICQ   Вверх
infarch
Дата 2.6.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Спасибо за подсказку, посмотрю что оно такое. А то действительно не знал за что браться. Во первы есть utf8::* , потом например Unicode::String. И кто его знает за что браться...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.