2013-05-13 12 views
6

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?

+0

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

+0

@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

+0

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

Antwort

2

Ruby kann Ihnen bei der Konvertierung von einem Multi-Byte-Zeichensatz in einen anderen helfen. Checken Sie in die these search results, und lesen Sie die Ruby String's encode Methode.

Auch Rubys Iconv ist dein Freund.

Schließlich schrieb James Gray eine series of articles, die dies im Detail abdecken.

Mit diesen Tools können Sie beispielsweise festlegen, dass sie zu einem visuell ähnlichen Zeichen transcodieren oder sie vollständig ignorieren.

Der Umgang mit alternativen Zeichensätzen ist eine der nervigsten Dinge, die ich jemals tun musste, weil Dateien alles enthalten können, aber als Text markiert werden. Du wirst es vielleicht nicht erwarten, und dann stirbt dein Code oder beginnt Fehler zu werfen, weil die Leute so genial sind, wenn es darum geht, alternative Charaktere in den Inhalt einzufügen.

+0

Gave up .. Ich denke, dass es keinen besseren Weg gibt, um fehlerhafte Dateien zu behandeln. Aber ich akzeptiere deine Antwort, weil es eine gute Richtlinie für Leute ist, die hier mit wohlgeformten Dateien landen. – fotanus

12

versuchen Sie dies:

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

Ich war auch in ROR Version 3.9.3 das gleiche Problem haben, und ich wurde Visual Studio 2010 als mein Editor. Notepad ++ hat mein Problem gelöst.

Wenn Sie Notepad ++ verwenden und das Problem ist in einer UTF-8-Datei:

  1. Öffnen Sie die Datei
  2. In Encoding-Menü wählen Sie „Encode in UTF-8 ohne BOM im Screenshot gezeigten

Screenshot where it showing the aforesaid menu item

weitere Details Refer this

+0

Wenn Sie eine Antwort oder eine Frage ablehnen, müssen Sie den Downvoter kommentieren, warum er abgelehnt hat. – Ravimallya

+3

Er fragt nach Hilfe in Ruby, also muss die Lösung Ruby/RoR verwenden, kein Notepad ++ –

Verwandte Themen