Как избавиться от не ascii символов в Perl и Python [оба]? - PullRequest
2 голосов
/ 15 июня 2011

Как избавиться от не-ascii символов, таких как «^ L, ¢, â» в Perl & Python?На самом деле при разборе PDF-файлов в Python & Perl.Я получаю эти специальные символы.Теперь у меня есть текстовая версия этих файлов PDF, но с этими специальными символами.Имеется ли какая-либо доступная функция, которая гарантирует, что файл или переменная не должны содержать никаких символов, отличных от ascii.

Ответы [ 3 ]

6 голосов
/ 15 июня 2011

Прямой ответ на ваш вопрос в Python - использовать .encode('ascii', 'ignore') в рассматриваемой строке Юникода. Это преобразует строку Unicode в строку ASCII и удаляет все символы, не относящиеся к ASCII:

>>> u'abc\x0c¢â'.encode('ascii', errors='ignore')
'abc\x0c'

Обратите внимание, что это не вывело '\ x0c'. Я добавил это, потому что вы упомянули символ «^ L», под которым я предполагаю, что вы имеете в виду символ подачи формы «\ x0c», который можно набрать с помощью Ctrl + L. Это является символом ASCII, и если вы хотите убрать его, вам также потребуется написать некоторый другой код для его удаления, например:

>>> str(''.join([c for c in u'abc\x0c¢â' if 32 <= ord(c) < 128]))
'abc'

НО это, возможно, не поможет вам, потому что я подозреваю, что вы не просто хотите удалить этих персонажей, но на самом деле решить проблемы, связанные с тем, почему они там находятся. В этом случае это может быть связано с проблемами кодировки Unicode. Чтобы справиться с этим, вам нужно будет задать гораздо более конкретные вопросы с конкретными примерами того, что вы ожидаете и что видите.

5 голосов
/ 15 июня 2011

Ради полноты, некоторые решения Perl. Оба возвращают ,,. В отличие от принятого ответа Python, я не использовал магические числа, такие как 32 или 128. Константы здесь можно найти намного проще в документации.

use 5.014; use Encode qw(encode); encode('ANSI_X3.4-1968', "\cL,¢,â", sub{q()}) =~ s/\p{PosixCntrl}//gr;

use 5.014; use Unicode::UCD qw(charinfo); join q(), grep { my $u = charinfo ord $_; 'Basic Latin' eq $u->{block} && 'Cc' ne $u->{category} } split //, "\cL,¢,â";
2 голосов
/ 15 июня 2011

В Python вы можете (ab) использовать для этой цели функцию кодирования (приглашение Python 3):

>>> "hello swede åäö".encode("ascii", "ignore")
b'hello swede '

выдает ошибки кодирования, но, поскольку у меня есть флаг ошибок на «игнорировать», онпросто счастливо продолжается.Очевидно, что это может маскировать другие ошибки.

Если вы хотите быть абсолютно уверены, что не пропускаете никаких «важных» ошибок, зарегистрируйте обработчик ошибок с помощью codecs.register_error(name, error_handler).Это позволит вам указать замену для каждого экземпляра ошибки.

Также обратите внимание, что в приведенном выше примере с использованием Python 3 я получаю обратно объект байтов, мне нужно будет преобразовать обратно в собственно Unicode, если янужен строковый объект.

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