Manchmal habe ich böse nicht druckbare Zeichen in der Mitte einer Zeichenfolge. Diese Zeichenfolgen sind Benutzereingaben, daher muss ich mein Programm dazu bringen, sie gut zu empfangen, anstatt zu versuchen, die Ursache des Problems zu ändern.Wie nicht druckbare/unsichtbare Zeichen in Ruby zu entfernen?
Zum Beispiel können sie zero width no-break space in der Mitte der Zeichenfolge haben. Zum Beispiel beim Analysieren einer .po
Datei war ein problematischer Teil die Zeichenfolge "he is a man of god"
in der Mitte der Datei. Während es alles in Ordnung scheint, Inspektion mit irb
zeigt:
"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]
Ich glaube, dass ich weiß, was ein BOM
ist, und ich kann es auch gut behandeln. Aber manchmal habe ich solche Zeichen in der Mitte der Datei, so dass es kein BOM
ist.
Mein aktueller Ansatz ist es, alle Zeichen zu entfernen, die ich böse war in einem wirklich stinkenden Art und Weise gefunden:
text = (text.codepoints - CODEPOINTS_BlACKLIST).pack("U*")
Die meisten in der Nähe Ich habe folgende this post war, die mich auf regexps zu :print:
Option verbleit. Allerdings war es nicht gut für mich:
"m".scan(/[[:print:]]/).join.codepoints
=> [65279, 109]
so ist die Frage: Wie kann ich alle nicht druckbare Zeichen aus einer Zeichenfolge in Ruby entfernen?
Es würde sehr hilfreich sein, wenn Sie mehr Quell- und Beispielzeichenfolgen mit den Zeichen zeigen, die Sie behandeln möchten. Das aktuelle Beispiel hilft nicht viel beim Ermitteln des Zeichensatzes oder anderer Werte, denen Sie begegnen. –
@theTinMan Danke, ich habe die Frage mit ein bisschen mehr Details bearbeitet. Der Zeichensatz ist UTF-8, glaube ich, aber ich habe nicht immer die Info, ich habe viele Dateien ohne BOM. Ich nehme an, dass es zumindest teilweise Unicode ist, wenn man sich die chinesische Übersetzung anschaut. – fotanus
Ruby hat eine Methode für String namens 'dump', die eine neue Zeichenkette erzeugt, bei der nicht druckbare Zeichen entfernt und Sonderzeichen maskiert werden. Docs für [String # dump] (https://ruby-doc.org/core-2.3.0/String.html#method-i-dump) Ruby 2.3.0 aber ich kann bestätigen, dass es bereits in den Dokumenten ist 1.8.7. – Aaron