Question

J'ai un tas de ficelle avec des codes d'échappement spéciaux que je veux stocker unescaped- par exemple, les spectacles d'interprétation

"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016" mais je veux montrer (lors de l'inspection) comme "\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"

Quelle est la méthode pour les Unescape? Je suppose que je pourrais faire un regex pour enlever 1 backslash de tous les antislashs n consécutifs, mais je n'ai pas beaucoup d'expérience regex et il semble qu'il devrait y avoir une « plus élégante » façon de le faire.

Par exemple, quand je puts MyString affiche la sortie que je voudrais, mais je ne sais pas comment je pourrais saisir que dans une variable.

Merci!

Edité pour ajouter du contexte: je cette classe qui est utilisée pour rassembler / restaurer des choses, mais quand je ramènerai quelques vieilles cordes, il recrache une erreur de type que je suis déterminé parce qu'ils ne sont pas - pour une raison inexplicable - stockées en base64. Ils semblent plutôt avoir été juste échappé, que je ne veux pas, parce que d'essayer de les restaurer donne de même la TypeError TypeError: incompatible marshal file format (can't be read) format version 4.8 required; 92.48 given parce que le maréchal regarde les premiers caractères de la chaîne pour déterminer le format.

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: Changement libellé - Je pensais qu'ils étaient « deux échappements », mais ce n'était que seul échappé. Whoops!

Était-ce utile?

La solution

Si vos chaînes vous donnent la sortie correcte lorsque vous les imprimer puis ils sont déjà échappés correctement. Les barres obliques inverses supplémentaires que vous voyez sont probablement parce que vous les affichez dans l'interpréteur interactif qui ajoute antislashs supplémentaire pour vous lorsque vous affichez des variables pour les rendre moins ambiguë.

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

Notez que même si elle ressemble à x contient deux barres obliques, la longueur de la chaîne est l'une. La barre oblique inverse supplémentaire est ajoutée par l'interprète et n'est pas vraiment partie de la chaîne.

Si vous pensez toujours qu'il ya un problème, s'il vous plaît être plus précis sur la façon dont vous affichez les chaînes que vous mentionnez dans votre question.


Edit: Dans votre exemple, la seule chose qui a besoin déséchapper sont des codes d'échappement octal. Vous pouvez essayer ceci:

x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top