Frage

ich ein paar String haben mit speziellen Escape-Codes, dass ich will unescaped- zB speichern, die Interpreter zeigt

"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016" aber ich will es zeigen (wenn geprüft) als "\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"

Was ist die Methode, um sie zu unescape? Ich stelle mir vor, dass ich eine Regex machen könnte 1 Backslash von jedem aufeinanderfolgenden n Schrägstriche zu entfernen, aber ich weiß nicht viel regex Erfahrung haben und es scheint, es sollte eine „elegantere“ Weg, um es zu tun.

Zum Beispiel, wenn ich puts MyString es zeigt die Ausgabe Ich mag würde, aber ich weiß nicht, wie ich das in eine Variable erfassen könnte.

Danke!

Edited Kontext hinzufügen: Ich habe diese Klasse, mit Marschall verwendet wird / ein paar Sachen wiederherstellen, aber wenn ich ein paar alte Saiten wiederherstellen spuckt eine Art Fehler, den ich bestimmt habe, ist, weil sie nicht waren - für unerklärlichen Gründen - gespeichert als base64. Sie erscheinen stattdessen gerade entkommen zu sein, was ich nicht will, weil versuchen, sie in ähnlicher Weise wiederherzustellen gibt den Typeerror TypeError: incompatible marshal file format (can't be read) format version 4.8 required; 92.48 given weil Marschall bei den ersten Zeichen der Zeichenfolge sieht das Format zu bestimmen.

require 'base64'
class MarshaledStuff < ActiveRecord::Base

  validates_presence_of :marshaled_obj

  def contents
    obj = self.marshaled_obj
    return Marshal.restore(Base64.decode64(obj))
  end

  def contents=(newcontents)
    self.marshaled_obj = Base64.encode64(Marshal.dump(newcontents))
  end
end

Edit 2: Geänderte Formulierung - ich dachte sie „Doppel entkommen“ war, aber es war nur Einzel entkommen. Whoops!

War es hilfreich?

Lösung

Wenn Sie die Saiten geben Sie den richtigen Ausgang, wenn Sie sie drucken dann sind sie richtig bereits entkommen. Die zusätzlichen Schrägstriche Sie sehen, sind wahrscheinlich, weil Sie sie in den interaktiven Interpreter anzeigen, jedoch für Sie zusätzliche Schrägstriche hinzufügt, wenn Sie Variablen zeigen sie weniger zweideutig zu machen.

> x
=> "\\"
> puts x
\
=> nil
> x.length
=> 1

Beachten Sie, dass, obwohl es so aussieht, x zwei Schrägstriche enthält, ist die Länge der Zeichenfolge ein. Der zusätzliche Backslash wird vom Interpreter hinzugefügt und ist nicht wirklich Teil der Zeichenfolge.

Wenn Sie immer noch denken, dass es ein Problem, bitte genauer sein, wie Sie die Saiten sind die Anzeige, dass Sie in Ihrer Frage erwähnt.


Edit: In Ihrem Beispiel das einzige, was notwendig URL-Kodierung ist Oktal-Escape-Codes. Sie könnten versuchen, diese:

x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top