web-dev-qa-db-fra.com

Supprimer les caractères non UTF d'une chaîne dans Ruby?

Comment supprimer des caractères non UTF8 d'une chaîne Ruby? J'ai une chaîne contenant par exemple "xC2". Je souhaite supprimer ce caractère de la chaîne afin qu'il devienne un UTF8 valide.

Ce:

text.gsub!(/\xC2/, '')

renvoie une erreur:

incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)

Je regardais également text.unpack ('U *') et string.pack, mais je n'ai rien obtenu.

31
Wojtek B.

Vous pouvez utiliser l'encodage pour cela. text.encode('UTF-8', :invalid => :replace, :undef => :replace)

Pour plus d'informations, consultez Ruby-Docs

81
Iuri G.

Tu pourrais le faire comme ça

# encoding: utf-8

class String
  def validate_encoding
    chars.select(&:valid_encoding?).join 
  end
end

puts "testing\xC2 a non UTF-8 string".validate_encoding
#=>testing a non UTF-8 string
8
peter

Vous pouvez utiliser /n, un péché

text.gsub!(/\xC2/n, '')

pour forcer la Regexp à fonctionner sur des octets.

Êtes-vous sûr que c'est ce que vous voulez? Tout caractère Unicode dans la plage [U + 80, U + BF] aura un \xC2 dans sa forme codée UTF-8.

5
ephemient

Essayez Iconv

1.9.3p194 :001 > require 'iconv'
# => true 
1.9.3p194 :002 > string = "testing\xC2 a non UTF-8 string"
# => "testing\xC2 a non UTF-8 string" 
1.9.3p194 :003 > ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
# => #<Iconv:0x000000026c9290> 
1.9.3p194 :004 > ic.iconv string
# => "testing a non UTF-8 string" 
4
Pritesh Jain

Votre texte a un codage ASCII-8BIT, à la place, vous devez utiliser ceci:

String.delete!("^\u{0000}-\u{007F}"); 

Cela servira le même but.

3
CharlesC

La meilleure solution à ce problème que j'ai trouvée est cette réponse à la même question: https://stackoverflow.com/a/8711118/36329 .

En bref: "€foo\xA0".chars.select(&:valid_encoding?).join

2
Ivaylo Novakov