Подтвердить что ты не робот

Как заменить символы Unicode на ASCII на Perl?

Я могу сделать это в vim так:

:%s/\%u2013/-/g

Как сделать эквивалент в Perl? Я думал, что это сработает, но похоже, что это не работает:

perl -i -pe 's/\x{2013}/-/g' my.dat
4b9b3361

Ответ 1

Для общего решения 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 от оригинального арабского. Это все еще довольно хорошо, я думаю,

Ответ 2

Это сделало трюк для меня:

perl -C1 -i -pe 's/–/-/g' my.dat

Обратите внимание, что первая строка является символом \x {2013}.

Ответ 3

Хм, немного жестко. Это похоже на это (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', это ошибка или функция дизайна.

Ответ 4

В качестве альтернативы вы можете просто указать кодировку UTF-8 символов, которые вы хотите заменить:

perl -i -pe 's/\xE2\x80\x93/-/g' my.dat

Здесь шестнадцатеричное значение E28093 - это кодировка UTF-8 шестнадцатеричного значения 2013. Вы можете найти различные инструменты онлайн, чтобы получить кодировку UTF-8 для символа, или вы можете просто посмотреть на my.dat в шестнадцатеричном редакторе.