2011-10-12 3 views
3

Disons que nous avons la chaîne '\342\200\231' (identique à "\\342\\200\\231"). Quel est un moyen rapide de convertir cette chaîne en "\342\200\231" (identique au caractère Unicode)?Comment convertir la chaîne en Ruby

+1

Donc, vous voulez convertir les guillemets simples avant et arrière en guillemets? Ou toutes les guillemets simples à doubles guillemets? –

+0

La partie ''' de la chaîne actuelle? Ou essayez-vous de convertir une chaîne à guillemets simples en une chaîne à guillemets doubles (ils sont tous les deux la même chose, mis à part les chaînes à guillemets doubles qui permettent plus de choses comme l'interpolation)? – birryree

+0

Non, la citation ne fait pas partie de la chaîne. Si vous collez les deux chaînes dans IRB, vous pouvez faire une idée de ce dont j'ai besoin. – taro

Répondre

3

Proposition:

s.gsub(/\\(\d{3})/) { $1.oct.chr } 

Cela dépend de ce que vous pouvez faire des hypothèses au sujet de votre entrée.

+0

+1 C'est beaucoup mieux que ma réponse. –

+0

Merci, c'est plus sûr que la solution eval. – taro

1

Ce que vous semblez demander est de savoir comment changer une chaîne de 12 caractères en une chaîne de trois caractères.

'\342\200\231' 

est de 12 caractères.

"\342\200\231" 

est composé de trois caractères; en fait trois octets de long, mais dans Ruby 1.8 c'est à peu près la même chose puisque les chaînes sont de toute façon des suites d'octets.

Voici un EVIL réponse pour vous (vous avez dit rapide), qui profite de eval pour faire votre « analyse syntaxique »:

irb(main):017:0> s = '\342\200\231' 
=> "\\342\\200\\231" 
irb(main):018:0> t = eval('"' + s + '"') 
=> "\342\200\231" 
irb(main):019:0> s.length 
=> 12 
irb(main):020:0> t.length 
=> 3 

Désolé pour le eval!

Je devrais probablement donner une réponse plus utile ... EDIT: Quelqu'un d'autre vient de le faire.

+0

Merci! Je n'aime pas eval, mais c'est une solution agréable et courte. – taro