2013-05-13 3 views
6

Иногда у меня есть злые непечатаемые символы в середине строки. Эти строки являются входными данными пользователя, поэтому я должен сделать свою программу хорошо принятой, а не пытаться изменить источник проблемы.Как удалить непечатаемые/невидимые символы в рубине?

Например, они могут иметь zero width no-break space в середине строки. Например, при анализе файла .po одной из проблемных частей была строка "he is a man of god" в середине файла. Хотя это все кажется правильным, осматривая его с irb показывает:

"he is a man of god".codepoints 
=> [104, 101, 32, 105, 115, 32, 97, 32, 65279, 109, 97, 110, 32, 111, 102, 32, 103, 111, 100] 

Я считаю, что я знаю, что BOM есть, и я даже справиться с этим хорошо. Однако иногда у меня есть такие символы в середине файла, поэтому это не BOM.

Моего текущий подход заключается в удалении всех символов, которые я нашел зло в самом деле вонючие моды:

text = (text.codepoints - CODEPOINTS_BlACKLIST).pack("U*") 

Наиболее близко я получил следующее this post которых этилированного меня :print: выбора на регулярных выражениях. Однако это не было никакой пользы для меня:

"m".scan(/[[:print:]]/).join.codepoints 
=> [65279, 109] 

поэтому вопрос: Как я могу удалить все непечатаемые символы из строки в Ruby?

+0

Это очень помогло бы, если бы вы указали больше строк источника и образца с символами, которые вы пытаетесь обработать. Текущая выборка не помогает при попытке определить набор кодов или другие значения, с которыми вы сталкиваетесь. –

+0

@theTinMan Спасибо, я отредактировал вопрос с немного более подробной информацией. Я считаю, что кодировка UTF-8, но у меня не всегда есть информация, у меня много файлов без спецификации. Я полагаю, что это хотя бы частично юникод, если посмотреть на китайский перевод. – fotanus

+0

Ruby имеет метод String, называемый 'dump', который создает новую строку с удалением непечатаемых символов и сбрасыванием специальных символов. Документы для [String # dump] (https://ruby-doc.org/core-2.3.0/String.html#method-i-dump) Ruby 2.3.0, но я могу подтвердить, что он находится в документах уже 1.8.7. – Aaron

ответ

2

Ruby может помочь вам преобразовать из одного многобайтового набора символов в другой. Проверьте в these search results, а также прочитайте метод encode Ruby String.

Также, Ruby's Iconv является вашим другом.

И, наконец, Джеймс Грей написал series of articles, которые подробно описывают это.

Одна из вещей, которые вы можете использовать с помощью этих инструментов, - это передать их перекодировке на визуально похожий символ или полностью игнорировать их.

Работа с альтернативными наборами символов является одной из самых ... раздражающих вещей, которые мне когда-либо приходилось делать, потому что файлы могут содержать что угодно, но быть помечены как текст. Вы можете не ожидать этого, а затем ваш код умирает или начинает бросать ошибки, потому что люди настолько изобретательны, когда придумывают способы вставки альтернативных символов в контент.

+0

Давай. Я думаю, что нет лучшего способа обработки искаженных файлов. Однако я принимаю ваш ответ, потому что это хороший ориентир для людей, которые заканчиваются здесь хорошо сформированными файлами. – fotanus

12

попробовать это:

>>"aaa\f\d\x00abcd".gsub(/[^[:print:]]/,'.') 
=>"aaa.d.abcd" 
0

Я был также имеющий тот же вопрос в ROR версии 3.9.3, и я использую Visual Studio 2010 в качестве моего редактора. Notepad ++ решил мою проблему.

Если вы используете Notepad ++ и проблема заключается в UTF-8 файл:

  1. Откройте файл
  2. В меню Кодировка выберите «Encode в UTF-8 без BOM, как показано на скриншоте

Screenshot where it showing the aforesaid menu item

Для получения более подробной информации Refer this

+0

Когда downvoting ответ или вопрос, downvoter должен прокомментировать, почему он отказался. – Ravimallya

+3

Он спрашивает о помощи в Ruby, поэтому решение должно использовать Ruby/RoR, а не блокнот ++ –