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.
Vous pouvez utiliser l'encodage pour cela. text.encode('UTF-8', :invalid => :replace, :undef => :replace)
Pour plus d'informations, consultez Ruby-Docs
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
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.
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"
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.
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