![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
К стыду своему должен признаться, что банальная с виду задача по перекодированию текста из utf8 в cp1251 поставила меня в тупик. Вроде все делаю "как книга пишет", а в ответ получаю или сообщения об ошибках, или Buchstabensalat.
Помогите пожалуйста! Дайте примитивный но рабочий пример для изучения! |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
perl -plne 'BEGIN { use encoding "cp1251",STDOUT => "utf8" }'
|
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Попытался это выполнить и получил ошибку: Can't find string terminator "'" anywhere before EOF at -e line 1.
Да и выглядит это немного неприменимо к моим целям. Я не хочу на лету перекодировать файлы. Мне нужно провести трансформацию отдельно взятой строки. Но даже если брать файлы... вот взгляните на пример:
У меня этот скрипт работает неправильно - в результате непонятные символы вместо utf. В чем может быть проблема? |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 как книга пишет # |
|||
|
||||
| infarch |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Возвращаясь к моему примеру: я подправил пару строк и добился перекодировки из cp1251 в utf8:
А вот как произвести обратную трансформацию? Я пробовал просто поменять енкодинги:
А в результате получил коллекцию ошибок типа: "\x{00d8}" does not map to cp1251 at... Как можно провести такое преобразование? Это сообщение отредактировал(а) infarch - 1.6.2010, 16:25 |
||||
|
|||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 как книга пишет # |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Так тоже не работает. Аналогичная ошибка: "\x{00d8}" does not map to koi8-r at...
Может разница в среде выполнения? Я запускаю скрипт под виндой и использую Active Perl 5.8.8 |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
может быть. у меня линух
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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) |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Вы правы, работает. Это я лоханулся - в тестовом файле были датские символы. А для них таки нет соответствия в cp1251. Так что вопрос с файлами можно считать закрытым.
Но есть другой вопрос: как производить преобразование на уровне скаляров, без записи в файл? |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
у меня сложилось впечатление, что вы категорически не желаете читать документацию.
|
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Документация предоставляет много вариантов, так что я даже и не знаю какой метод предпочтительнее.
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 Документация предоставляет много вариантов # |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Спасибо за подсказку, посмотрю что оно такое. А то действительно не знал за что браться. Во первы есть utf8::* , потом например Unicode::String. И кто его знает за что браться...
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |