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?
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. –
@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
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