2010-07-08 18 views
15

Parece ser un método muy simple y muy necesario. Necesito eliminar todos los caracteres que no sean ASCII de una cadena. por ejemplo, © etc. Consulte el siguiente ejemplo.Cómo eliminar todos los caracteres que no sean ASCII de una cadena en Ruby

#coding: utf-8 
s = " Hello this a mixed string © that I made." 
puts s.encoding 
puts s.encode 

de salida:

UTF-8 
Hello this a mixed str 

ing © que hice.

Cuando me alimento que esto Watir, se produce el error siguiente: codificación de caracteres incompatibles: UTF-8 y ASCII de 8 bits

Así que mi problema es que quiero para deshacerse de todos los caracteres no ASCII antes de usarlo. No sabré qué codificación utiliza la cadena fuente "s".

He estado buscando y experimentando desde hace bastante tiempo.

Si intento utilizar

puts s.encode('ASCII-8BIT') 

Se da el error:

: "\xC2\xA9" from UTF-8 to ASCII-8BIT (Encoding::UndefinedConversionError) 

Respuesta

1

UTF-8 es una codificación de longitud variable. Cuando un personaje ocupa un byte, su valor coincide con ASCII de 7 bits. Entonces, ¿por qué no solo buscas bytes con un '1' en el MSB, y luego los eliminas a ellos y a sus trailers? Un byte que comience con '110' irá seguido de un byte adicional. Un byte que comience con '1110' irá seguido de dos. Y un byte que comience con '11110' irá seguido de tres, el máximo admitido por UTF-8.

Todo esto está fuera de mi cabeza. Podría estar equivocado.

33

Simplemente puede traducir literalmente lo que pidió en un Regexp. Usted escribió:

I want to get rid of all non ASCII characters

Podemos expresarlo de otro modo un poco:

I want to substitue all characters which don't thave the ASCII property with nothing

Y eso es una declaración que puede ser directamente expresaron en un Regexp:

s.gsub!(/\P{ASCII}/, '') 

Como alternativa , también puede usar String#delete!:

s.delete!("^\u{0000}-\u{007F}") 
+6

1000.tiempo {puts "6 de 5 estrellas"} - Esto me salvó el tocino Jörg. Gracias por educarme por poder. – lazyPower

+1

para el '{ASCII}' que obtengo 'Codificación :: CompatibilityError: coincidencia de codificación regexp incompatible (expresión regular UTF-8 con cadena ASCII-8BIT)' en ruby ​​1.9.3 –

+2

para ruby ​​1.9, .3 necesita usar delete , no el enfoque {ASCII} – jpwynn

Cuestiones relacionadas