Как заменить символы Unicode на ASCII в Perl? - PullRequest
12 голосов
/ 22 февраля 2010

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

:%s/\%u2013/-/g

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

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

Ответы [ 4 ]

36 голосов
/ 22 февраля 2010

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

4 голосов
/ 22 февраля 2010

Это помогло мне:

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

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

2 голосов
/ 22 февраля 2010

Хм, немного сложно.Это, кажется, делает это (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' ошибкой или конструктивной особенностью.

0 голосов
/ 14 июля 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...