¿Hay alguna forma en Ruby 1.9 para eliminar secuencias de bytes no válidas de las cadenas?
encoding character-encoding (4)
Supongamos que tiene una cadena como "€foo/xA0"
, codificada en UTF-8. ¿Hay alguna forma de eliminar secuencias de bytes no válidas de esta cadena? (por lo que obtienes "€foo"
)
En ruby-1.8, puedes usar Iconv.iconv(''UTF-8//IGNORE'', ''UTF-8'', "€foo/xA0")
pero ahora está en desuso. "€foo/xA0".encode(''UTF-8'')
no hace nada, ya que ya es UTF-8. Lo intenté:
"€foo/xA0".force_encoding(''BINARY'').encode(''UTF-8'', :undef => :replace, :replace => '''')
cuyos rendimientos
"foo"
Pero eso también pierde el carácter multibyte válido €
Ruby 2.0 y 1.9.3
"€foo/xA0".encode(Encoding::UTF_8, Encoding::UTF_8, :invalid => :replace)
Ruby 2.1+
"€foo/xA0".scrub
data = '''' if not (data.force_encoding("UTF-8").valid_encoding?)
"€foo/xA0".chars.select(&:valid_encoding?).join
"€foo/xA0".encode(''UTF-16le'', invalid: :replace, replace: '''').encode(''UTF-8'')