Иногда у меня есть злые непечатаемые символы в середине строки. Эти строки являются входными данными пользователя, поэтому я должен сделать свою программу хорошо принятой, а не пытаться изменить источник проблемы.Как удалить непечатаемые/невидимые символы в рубине?
Например, они могут иметь 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?
Это очень помогло бы, если бы вы указали больше строк источника и образца с символами, которые вы пытаетесь обработать. Текущая выборка не помогает при попытке определить набор кодов или другие значения, с которыми вы сталкиваетесь. –
@theTinMan Спасибо, я отредактировал вопрос с немного более подробной информацией. Я считаю, что кодировка UTF-8, но у меня не всегда есть информация, у меня много файлов без спецификации. Я полагаю, что это хотя бы частично юникод, если посмотреть на китайский перевод. – fotanus
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