Я могу сделать это в vim так:
:%s/\%u2013/-/g
Как сделать эквивалент в Perl? Я думал, что это сработает, но похоже, что это не работает:
perl -i -pe 's/\x{2013}/-/g' my.dat
Я могу сделать это в vim так:
:%s/\%u2013/-/g
Как сделать эквивалент в Perl? Я думал, что это сработает, но похоже, что это не работает:
perl -i -pe 's/\x{2013}/-/g' my.dat
Для общего решения Text:: Unidecode транслитерирует почти все, что было брошено на него в чистый US-ASCII.
Итак, в вашем случае это будет работать:
perl -C -MText::Unidecode -n -i -e'print unidecode( $_)' unicode_text.txt
. -C должен убедиться, что вход считывается как utf8
Он преобразует это:
l'été est arrivé à peine après aôut
¿España es un paìs muy lindo?
some special chars: » « ® ¼ ¶ – – — Ṉ
Some greek letters: β ÷ Θ ¬ the α and ω (or is it Ω?)
hiragana? みせる です
Здравствуйте
السلام عليكم
в это:
l'ete est arrive a peine apres aout
?Espana es un pais muy lindo?
some special chars: >> << (r) 1/4 P - - -- N
Some greek letters: b / Th ! the a and o (or is it O?)
hiragana? miseru desu
Zdravstvuitie
lslm `lykm
Последний показывает пределы модуля, которые не могут вывести гласные и получить as-salaamu `alaykum от оригинального арабского. Это все еще довольно хорошо, я думаю,
Это сделало трюк для меня:
perl -C1 -i -pe 's/–/-/g' my.dat
Обратите внимание, что первая строка является символом \x {2013}.
Хм, немного жестко. Это похоже на это (Perl 5.10.0 на MacOS X 10.6.2):
perl -w -e "
use open ':encoding(utf8)';
use open ':std';
while (<>)
{
s/\x{2013}/-/g;
print;
}
"
Я еще не минимизировал это. См. perldoc в инструкции 'use open'.
Судя по моим (ограниченным) экспериментам, опция "-p" не распознает директивы "use open". Вы можете использовать "qw()", чтобы процитировать слова:
perl -w -e "
use open qw( :encoding(utf8) :std );
while (<>)
{
s/\x{2013}/-/g;
print;
}
Я не знаю, если '-p' не подчиняется 'use open', это ошибка или функция дизайна.
В качестве альтернативы вы можете просто указать кодировку UTF-8 символов, которые вы хотите заменить:
perl -i -pe 's/\xE2\x80\x93/-/g' my.dat
Здесь шестнадцатеричное значение E28093 - это кодировка UTF-8 шестнадцатеричного значения 2013. Вы можете найти различные инструменты онлайн, чтобы получить кодировку UTF-8 для символа, или вы можете просто посмотреть на my.dat в шестнадцатеричном редакторе.