2013-05-13 11 views
6

Czasami mam złe niedrukowalne znaki w środku sznurka. Te ciągi są wprowadzane przez użytkownika, więc muszę sprawić, że mój program je odbierze, zamiast próbować zmienić źródło problemu. Na przykład mogą mieć zero width no-break space w łańcuchu znaków. Na przykład podczas analizowania pliku .po jedną z problematycznych części był ciąg "he is a man of god" w środku pliku. Chociaż to wszystko wydaje się prawidłowe, kontrolowanie go irb pokazach:Jak usunąć znaki niedrukowalne/niewidoczne w ruby?

"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] 

Wierzę, że wiem, co to BOM jest, a ja nawet go obsłużyć. Jednak czasami mam takie znaki w środku pliku, więc nie jest to BOM.

Moje obecne podejście jest usunąć wszystkie znaki, które znalazłem zło w naprawdę śmierdząca mody:

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

Najbardziej blisko Dostałem następujące this post który dowodzony mi :print: opcja na wyrażeniach regularnych. Jednak to nie był dobry dla mnie:

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

więc pytanie brzmi: Jak mogę usunąć wszystkie znaki niedrukowalne od ciąg w Ruby?

+0

Bardzo by pomogło, gdybyś pokazał więcej łańcuchów źródłowych i przykładowych z postaciami, z którymi próbujesz sobie poradzić. Bieżąca próbka nie pomaga wiele, gdy próbuje się określić zestaw kodowy lub jakie inne wartości napotykasz. –

+0

@tinMan Dzięki, zredagowałem pytanie z nieco większą ilością szczegółów. Prawdopodobnie zestaw znaków to UTF-8, ale nie zawsze mam informacje, mam wiele plików bez LM. Przypuszczam, że jest to przynajmniej częściowo unicode, patrząc na chińskie tłumaczenie. – fotanus

+0

Ruby ma metodę w łańcuchu o nazwie 'dump', która tworzy nowy ciąg z usuniętymi znakami niedrukowalnymi i znakami specjalnymi. Dokumenty dla [String # dump] (https://ruby-doc.org/core-2.3.0/String.html#method-i-dump) Ruby 2.3.0, ale mogę potwierdzić, że jest w dokumentach już na wczesnym etapie 1.8.7. – Aaron

Odpowiedz

2

Ruby może pomóc w konwersji jednego zestawu znaków wielobajtowych na inny. Sprawdź w these search results, a także przeczytaj na temat metody Ruby String na encode.

Także, Ruby's Iconv jest twoim przyjacielem.

Wreszcie James Gray napisał series of articles, który szczegółowo omawia tę kwestię.

Jedną z rzeczy, które możesz zrobić za pomocą tych narzędzi, jest nakazanie im transkodowania na podobną wizualnie postać lub całkowite ich zignorowanie.

Radzenie sobie z alternatywnymi zestawami znaków jest jedną z najbardziej irytujących rzeczy, jakie kiedykolwiek musiałem zrobić, ponieważ pliki mogą zawierać dowolne treści, ale muszą być oznaczone jako tekst. Możesz tego nie oczekiwać, a wtedy twój kod zginie lub zacznie rzucać błędy, ponieważ ludzie są tak pomysłowi, gdy wymyślacie sposoby wstawiania znaków alternatywnych do treści.

+0

Oddałem się .. Myślę, że nie ma lepszego sposobu na obsługę źle sformułowanych plików. Jednak akceptuję twoją odpowiedź, ponieważ jest to dobra wskazówka dla ludzi, którzy kończą tutaj z dobrze uformowanymi plikami. – fotanus

12

spróbuj tego:

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

Byłem też mają ten sam problem w ROR wersji 3.9.3, a ja za pomocą Visual Studio 2010 w moim edytorze. Notepad ++ rozwiązał mój problem.

Jeśli używasz Notepad ++ i problem jest w UTF-8 pliku:

  1. Otwórz plik
  2. W menu Kodowanie wybierz „Kodowanie UTF-8 bez BOM, jak pokazano na zrzucie

Screenshot where it showing the aforesaid menu item

więcej szczegółów Refer this

+0

Po odrzuceniu odpowiedzi lub pytania, osoba, która odrzuciła wniosek, musi skomentować, dlaczego przegłosował. – Ravimallya

+3

Pyta o pomoc w Ruby, więc rozwiązanie musi używać Ruby/RoR, a nie notatnika ++ –

Powiązane problemy